CSemaphore semaphoreWrite(2,2); //資源最多訪問線程2個,當前可訪問線程數2個
在按鈕下用如下:其中WriteA函數內容會在線程激活後執行。
CWinThread *pWriteA=AfxBeginThread(WriteA,
&m_ctrlA,
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
pWriteA->ResumeThread();
CWinThread *pWriteB=AfxBeginThread(WriteB,
&m_ctrlB,
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
pWriteB->ResumeThread(); //激活線程 掛起用SuspendThread()
SuspendThread和ResumeThread的作用其實很簡單,他們都是通過線程的HANDLE到線程的數據結構中將一個計數的變量(只有一個
BYTE大小的int變量)進行加一減一的操作,可以簡單的認爲
DWORD SuspendThread(HANDLE
hThread)
{
...
nThreadSuspendCount ++;
...
}
DWORD ResumeThread(HANDLE hThread)
{
...
nThreadSuspendCount --;
...
}
(當然實際不會只有上面那麼簡單,還會有許多判斷,包括BYTE的溢出監測、讀寫獨佔控制等)
如果線程在運行時監測到nThreadSuspendCount >
0,那麼線程就會暫停處理任何消息和循環的進行,這時CPU將不爲該線程分配時間片,如果nThreadSuspendCount <=
0,線程將正常運行!
所以ResumeThread的一次調用並不一定導致線程的運行,SuspendThread也不一定導致線程掛起,關鍵在於線程的掛起計數!