[基础]等待函数
等待函数
/************************************************************************//* 等待单个对象函数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;}