等待函數
/************************************************************************//* 等待單個對象函數WaitForSingleObject()DWORD WaitForSingleObject( //功能等待單個對象,如果對象置位,則返回__in HANDLE hHandle, //同步對象的控制代碼__in DWORD dwMilliseconds ) //等待ms數,如果需要無限等待,則設為INFINITE*//************************************************************************//************************************************************************//* 等待多個對象函數WaitFormultipleObjects() WaitForMultipleObjects(DWORD nCount, //lpHandles中的同步對象的個數const HANDLE* lpHandles, //同步物件控點的數組BOOL bWaitAll, //是否等待lpHandles中的所有的對象;為TRUE,則等待對象全部置位才返回;為FALSE,則等待的對象之一置位則返回DWORD dwMilliseconds ) //等待的ms數*//************************************************************************/
小demo
/* 本執行個體示範多個線程的互同步,主線程建立好了多個事件對象,然後建立多個線程,每個線程都有一個事件對象。之後向共用記憶體中寫入資料,由主線程建立的若干個子線程等待主線程寫操作完成後置位事件,然後各個子線程都去讀共用記憶體中的資料。讀完後,各子線程將各自的事件置位。 主線程在完成寫操作共置位事件後就等待各個子線程所對應的事件是否置位,如果所有的子線程的事件都已經置位,那麼說明所有子線程都完成了操作,主線程又開始向共用記憶體中寫入資料。*/#include <windows.h>#include <stdio.h>#define NUMTHREADS 3#define FOR_TIME 5HANDLE hWriteEvents[NUMTHREADS];HANDLE hReadEvents[NUMTHREADS];BYTE lpShareBuf[16];//線程函數,讀共用記憶體DWORD WINAPI ThreadProc(LPVOID lParam){int threadIndex=(int)lParam;byte lpRead[16];for (int i=0;i<FOR_TIME;i++){//等待寫時間置位,表示資料已經寫入WaitForSingleObject(hWriteEvents[threadIndex],INFINITE);Sleep(rand()%20);//類比資料處理所需要的時間間隔CopyMemory(lpRead,lpShareBuf,16);SetEvent(hReadEvents[threadIndex]);//將讀Event置位,表示讀操作完成printf("線程 %u\t第%d次讀,內容:%s\n",threadIndex,i,lpRead);//列印讀到的內容}return 0;}//由主線程調用,向共用記憶體中寫入資料,等待所有讀線程讀完宏函數返回void WriteToBuffer(){//完成FOR_TIME次讀寫for (int i=0;i<FOR_TIME;i++){Sleep(rand()%100);//寫入需要的時間間隔wsprintf((LPTSTR)lpShareBuf,"share %d",i);//寫入共用記憶體for (int j=0;j<NUMTHREADS;j++){//將線程對應的寫Event置為"標誌的",表示寫操作完成,其他線程可以開始讀SetEvent(hWriteEvents[j]);}//等待所有線程讀完,開始下次寫入WaitForMultipleObjects(NUMTHREADS,hReadEvents,TRUE,INFINITE);}}void Init(){//建立多個線程,讀共用記憶體,主線程寫共用記憶體//每個線程都有對應的讀寫同步事件for (int i=0;i<NUMTHREADS;i++){hWriteEvents[i]=CreateEvent(NULL,FALSE,FALSE,NULL);//自動重設,初始為未置位的hReadEvents[i]=CreateEvent(NULL,FALSE,FALSE,NULL);HANDLE hThread=CreateThread(NULL,0,ThreadProc,(LPVOID)i,0,NULL);}WriteToBuffer();}int main(){Init();system("pause");return 0;}