等待函数
/************************************************************************/
/* 等待单个对象函数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 5
HANDLE 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;
}