内核对象都有一个计数器,Create和Open都加一,Close都减一,直到0内核对象才会销毁。
1、事件对象的创建
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全属性 NULL时为系统默认
BOOL bManualReset, // TRUE 通过调用ResetEvent将事件对象标记为未通知
BOOL bInitialState, // TRUE 已通知状态 FALSE未通知状态
LPCTSTR lpName // 对象名称 以NULL结尾的字符串
);
OpenEvent(EVENT_ALL_ACCESS, FALSE, "XYZ");
2、事件对象的控制
BOOL SetEvent(HANDLE hEvent); //将对象设置为已通知
3、关闭时间对象句柄
//关闭句柄
CloseHandle(HANDLE);
CreateEvent第二个参数位true的话,就意味着当第一个线程waitfor到的话,事件为已通知状态,且事件状态不改变。fasle的话,只要waitfor到的话事件状态从已通知变为未通知。
线程同步程序。
#include<windows.h> HANDLE h1; HANDLE h2; int x = 0; DWORD WINAPI ThreadCustomer(LPVOID lpParameter) { for(int i = 0; i < 10; i++) { WaitForSingleObject(h2, INFINITE); x = 0; DWORD id = GetCurrentThreadId(); printf("%d------>%d ", id, x); SetEvent(h1); } return 0; } DWORD WINAPI ThreadProduct(LPVOID lpParameter) { for(int i = 0; i < 10; i++) { WaitForSingleObject(h1, INFINITE); x = 1; DWORD id = GetCurrentThreadId(); printf("%d------>%d ", id, x); SetEvent(h2); } return 0; } int main(int argc, char* argv[]) { HANDLE hThread[2]; h1 = CreateEvent(NULL, FALSE, TRUE, NULL); h2 = CreateEvent(NULL, FALSE, FALSE, NULL); hThread[0] = ::CreateThread(NULL, 0, ThreadCustomer, NULL, 0, NULL); hThread[1] = ::CreateThread(NULL, 0, ThreadProduct, NULL, 0, NULL); WaitForMultipleObjects(2, hThread, TRUE, INFINITE); CloseHandle(h1); CloseHandle(h2); CloseHandle(hThread[0]); CloseHandle(hThread[1]); return 0; }