多線程編程MFC

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也不一定導致線程掛起,關鍵在於線程的掛起計數!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章