Windows 下多线程编程技术


(1) 线程的创建:(主要以下2)

CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc,
  LPVOID lParam,
  int nPriority = THREAD_PRIORITY_NORMAL,
  UINT nStackSize = 0,
  DWORD dwCreateFlags = 0,
  LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
  );

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
  SIZE_T dwStackSize, // initial stack size
  LPTHREAD_START_ROUTINE lpStartAddress, // thread function
  LPVOID lpParameter, // thread argument
  DWORD dwCreationFlags, // creation option
  LPDWORD lpThreadId // thread identifier
  );

DWORD WINAPI myroutine(LPVOID param)

{

       printf("%d,hello from subroutine!\n",*((int*)param));

       return NULL;

}

int _tmain(int argc, _TCHAR* argv[])

{

       printf("hello from main!\n");

       int iSub = 11;

       DWORD dId;

       HANDLE hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)myroutine,(LPVOID)&iSub,0,&dId);

       return 0;

}

(2) 结束线程:

BOOL CloseHandle(HANDLE hObject);

BOOLTerminateThread( HANDLEhThread,DWORDdwExitCode);

VOID ExitThread(DWORD dwExitCode);

结束线程最好使用线程函数返回,TerminateThreadExitThread2种方式都不推荐使用,也尽量不用。

( 3 ) 线程的暂停/重启:

DWORD SuspendThread( HANDLE hThread );

DWORD ResumeThread( HANDLE hThread );

( 4 ) 线程优先级:

BOOL SetThreadPriority( HANDLE hThread, int nPriority ); 从主线程继承基础上设置优先级。

( 5 ) 公共资源的并发访问与同步:

临界区:

Critical_Section cs;

void main()

{

       InitializeCriticalSection(&cs);

       …

       DeleteCriticalSection(&cs);

}

DWORD WINAPI mythread(LPVOID param)

{

EnterCriticalSection(&cs);       ¬

…//操作。。。

LeaveCriticalSection(&cs);

}

锁机制:

CCriticalSection cs;

void main()

{

}

DWORD WINAPI mythread(LPVOID param)

{

cs.Lock();

cs.Unlock();

}

互斥量:

HANDLE hMutex;

void main()

{

       hMutex = CreateMutex(NULL,FALSE,”myownmutex”);

       …

}

DWORD WINAPI mythread(LPVOID param)

{

       WaitForSingleObject(hMutex,INFINITE);    ¬

       …

       ReleaseMutex(hMutex);

}

信号量:

HANDLE hSema;

void main()

{

       hSema = CreateSemaphore(NULL,nInit,nMax,”myownsemaphore”);

       …

}

DWORD WINAPI mythread(LPVOID param)

{

       WaitForSingleObject(hSema,5000L);   ¬

       …

       ReleaseSemaphore(hSema,1,NULL);

}

事件:

HANDLE hEvent;

void main()

{

       hEvent = CreateEvent(NULL,FALSE,TRUE,”myownevent”);

       …

       WaitForSingleObject(hEvent,INFINITE);     ¬

}

DWORD WINAPI mythread(LPVOID param)

{

       …//操作。。。

       SetEvent(hEvent);

}

posted @ 2014-01-20 17:34  Jamy Cai  阅读(410)  评论(0编辑  收藏  举报