1 创建事件对象
HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, // SD BOOL bManualReset, // reset type BOOL bInitialState, // initial state LPCTSTR lpName // object name );
参数:
lpEeventAttributes 安全性,一般为null
bManualReset 创建事件对象的形式,若为true,则为人工重置的事件对象,false 则为机器重置的对象bInitialState 创建事件对象的状态,若为true,则为有信号状态,否则为无信号状态lpName 创建事件对象的名字,可为null
返回值
返回事件对象的句柄handle
2 设置事件对象
HANDLE hEvent // handle to event ); 设置事件对象为有信号状态BOOL ResetEvent( HANDLE hEvent // handle to event ); 设置事件对象为无信号状态
BOOL SetEvent(#include <Windows.h> #include <iostream> using namespace std; DWORD WINAPI threadProc1(LPVOID lpParameter ); DWORD WINAPI threadProc2(LPVOID lpParameter ); HANDLE handle; int tickets = 100; void main() { HANDLE handthread1; HANDLE handthread2; handthread1 = CreateThread(NULL,0,threadProc1,NULL,0,NULL); handthread2 = CreateThread(NULL,0,threadProc2,NULL,0,NULL); CloseHandle(handthread1); CloseHandle(handthread2); handle = CreateEvent(NULL,FALSE,FALSE,NULL); SetEvent(handle); Sleep(4000); } DWORD WINAPI threadProc1(LPVOID lpParameter) { while(1) { WaitForSingleObject(handle,INFINITE); if(tickets > 0) { Sleep(1); cout<<"thread1 sell"<<tickets--<<endl; } else break; SetEvent(handle); } return 0; } DWORD WINAPI threadProc2(LPVOID lpParameter) { while(1) { WaitForSingleObject(handle,INFINITE); if(tickets > 0) { Sleep(1); cout<<"thread2 sell"<<tickets--<<endl; } else break; SetEvent(handle); } return 0; }
人工重置的事件对象 和 自动重置的事件对象的区别当人工重置的事件对象的到通知,等待该事件对象的所有线程变为可调度线程,当自动重置的事件对象得到通知,等待该事件的线程只有一个变为可调度线程自动重置的事件对象在线程结束后自动变为无信号状态