核心對象用於線程同步
這個是我QQ裡面寫的一篇核心對象同步的文章
http://user.qzone.qq.com/276907985/blog/1372851189
1 事件核心對象
包含3個資料結構:1 引用計數 2 自動還是手動的BOOL值 3 是否觸發的布爾值
手動事件和自動事件
當自動事件被觸發時,只有一個正在等待的線程被調度
當手動事件被觸發時,所以等待它的線程都被調度
CreateEvent 是一個宏,一個是CreateEventA和CreateEventW
HANDLE
WINAPI
CreateEvent(
__in_opt LPSECURITY_ATTRIBUTES lpEventAttributes,
__in BOOL bManualReset,
__in BOOL bInitialState,
__in_opt LPCTR lpName
);
參數1 表示安全屬性
參數2 True表示手動事件,False表示自動事件
參數3 True表示觸發狀態,False表示沒有觸發
參數4 一個NULL字元結尾的字串,是一個名字
SetEvent 把事件變成觸發狀態
RssetEvent 把事件變成未觸發狀態
對於自動事件來說,不需要RssetEvent, WaitForSingleObject 等待函數會自動重設為未觸發狀態
手動事件,沒有等待成功的副作用
PulseEvent 會把事件置為觸發,然後馬上重設為未觸發
當自動事件時,只有當正在等待的一個線程會觸發
當手動事件時,只有正在等待的所以線程被觸發
#include <Windows.h>#include <stdio.h>#include <tchar.h>#include <process.h>#include <winbase.h>HANDLE hEventAuto = NULL;HANDLE hEventManual = NULL;unsigned int WINAPI ThreadFunc1(LPVOID lp){//手動事件WaitForSingleObject(hEventManual,INFINITE);printf("1 手動事件等到\n");return 0;}unsigned int WINAPI ThreadFunc2(LPVOID lp){//手動事件WaitForSingleObject(hEventManual,INFINITE);printf("2 手動事件等到\n");return 0;}unsigned int WINAPI ThreadFunc3(LPVOID lp){//自動事件 等待成功後,會自動把事件重設為未觸發,所以需要自己SetEventWaitForSingleObject(hEventAuto, INFINITE);SetEvent(hEventAuto);printf("3 等待自動事件\n");return 0;}unsigned int WINAPI ThreadFunc4(LPVOID lp){//自動事件WaitForSingleObject(hEventAuto, INFINITE);SetEvent(hEventAuto);printf("4 等待自動事件\n");return 0;}int main(){hEventAuto= CreateEvent(NULL, FALSE, FALSE, NULL);hEventManual= CreateEvent(NULL, TRUE, FALSE, NULL);HANDLE hThreadArray[10]; hThreadArray[0] = (HANDLE)_beginthreadex(NULL, 0,ThreadFunc1, NULL, 0, NULL); hThreadArray[1] = (HANDLE)_beginthreadex(NULL, 0,ThreadFunc2, NULL, 0, NULL); hThreadArray[2] = (HANDLE)_beginthreadex(NULL, 0,ThreadFunc3, NULL, 0, NULL); hThreadArray[3] = (HANDLE)_beginthreadex(NULL, 0,ThreadFunc4, NULL, 0, NULL);//手動事件需要自己設定觸發SetEvent(hEventManual);SetEvent(hEventAuto);WaitForMultipleObjects(4,hThreadArray,TRUE,INFINITE);getchar();return 0;}