//本文描述的事件,是线程语境的事件(event)
//本文在c++ buider 10.3 64/32位,6.0都 调试通过。
#include <vcl.h>
#include<windows.h>
#include<stdio.h>
int product_buffer = 3;
int product_num = 2;
//定义事件句柄,由于在多个线程中使用,需定义为全局变量
HANDLE hde_Producer,hde_Consumer;
DWORD WINAPI Producer(LPVOID lpParameter)
{ while(1)
{ //等待生产者线程的事件信号
WaitForSingleObject(hde_Producer,INFINITE);
product_num++;
printf("producer: produce 1, %d in buffer\n", product_num);
Sleep(1000);
//将消费者进程的事件置为Signaled
SetEvent(hde_Consumer);
}
return 0;
}
DWORD WINAPI Consumer(LPVOID lpParameter)
{ while(1)
{ //等待事件信号
WaitForSingleObject(hde_Consumer,INFINITE);
product_num--;
if (product_num <= 1)
{printf("consumer: consume 1, only %d left in buffer, alert!\n",product_num);
}
else
{ printf("consumer: consume 1, %d left in buffer\n",product_num);
}
Sleep(1000);
//将生产者进程的事件置为Signaled
SetEvent(hde_Producer);
}
return 0;
}
#if(__BORLANDC__<=1380) // 低版本
int main(int argc, char* argv[])
#else //高版本
int _tmain(int argc, _TCHAR* argv[])
#endif
{ HANDLE ThreadHandles[2];
//创建两个事件,分别用于触发生产者进程和消费者进程。
//生产者进程的事件的初始状态设置为有信号,消费者为无信号。两个事件都自动复位
hde_Producer = CreateEvent(NULL,FALSE,TRUE,NULL);
hde_Consumer = CreateEvent(NULL,FALSE,FALSE,NULL);
ThreadHandles[0] = CreateThread(
NULL,
0,
Producer,
NULL,
0,
NULL
);
ThreadHandles[1] = CreateThread(
NULL,
0,
Consumer,
NULL,
0,
NULL
);
WaitForMultipleObjects(2,ThreadHandles,TRUE,INFINITE);
return 0;
}