包括人工重置的事件和自動重置的事件。
當人工重置事件得到通知時,等待該事件的所有執行緒成為可排程執行緒;它沒有成功等待的***
當自動重置事件得到通知時,等待該事件的執行緒中只有乙個變為可排程執行緒。其成功等待的***是該事件物件自動重置為未通知狀態。
事件核心物件通過createevent建立,初始可以是通知或未通知狀態,setevent將事件改為已通知狀態,resetevent將事件設為未通知狀態。
當乙個執行緒執行初始化操作,然後通知另乙個執行緒執行剩餘的操作時,經常使用人工事件物件。另外如果乙個寫執行緒,多個讀執行緒,可以讓寫執行緒完成寫操作時通過人工事件通知讀執行緒讀取資料。而自動事件物件則可以用於保護資源在同一時間只有乙個執行緒可以訪問,因為它保證只有乙個執行緒啟用。
示例1:人工重置事件
// 使用人工重置事件,執行緒間同步
#include #include #include using namespace std;
int ticket = 100;
handle hdl = nullptr;
unsigned int __stdcall fun1(lpvoid lpparameter)
return 0;
}unsigned int __stdcall fun2(lpvoid lpparameter)
return 0;
}int main()
; hthread[0] = (handle)_beginthreadex(nullptr, 0, fun1, nullptr, 0, nullptr);
hthread[1] = (handle)_beginthreadex(nullptr, 0, fun2, nullptr, 0, nullptr);
closehandle(hthread[0]);
closehandle(hthread[1]);
getchar();
closehandle(hdl);
return 0;
}
執行結果:擷取了部分,可以看到執行緒1和執行緒2交替執行。
示例2:自動重置事件
// 使用自動重置事件,執行緒間同步
#include #include #include using namespace std;
int ticket = 100;
handle hdl = nullptr;
unsigned int __stdcall fun1(lpvoid lpparameter)
return 0;
}unsigned int __stdcall fun2(lpvoid lpparameter)
return 0;
}int main()
; hthread[0] = (handle)_beginthreadex(nullptr, 0, fun1, nullptr, 0, nullptr);
hthread[1] = (handle)_beginthreadex(nullptr, 0, fun2, nullptr, 0, nullptr);
closehandle(hthread[0]);
closehandle(hthread[1]);
getchar();
closehandle(hdl);
return 0;
}
執行結果:
用核心物件進行執行緒同步 事件核心物件
事件核心物件 1.手動重置事件 當乙個手動重置事件被觸發的時候,所有等待該事件的執行緒都變為可排程狀態。所以要注意此時所有的執行緒都只能以唯讀的方式來訪問記憶體,這也是多個執行緒能夠同時執行的唯一原因 2.自動重置事件 當乙個自動重置事件被觸發的時候,只有乙個等待該事件的執行緒都變為可排程狀態 當執...
執行緒同步 核心物件實現執行緒同步 事件核心物件
1 事件核心物件23 事件型別物件有兩種不同型別,手動重置和自動重置 4手動重置 當乙個手動重置物件被觸發時候,等待該物件的所有執行緒變為可排程。5自動重置 當乙個自動重置物件被觸發時,只有乙個等待該事件的執行緒會變為可排程67 下面是乙個建立事件核心物件的函式 8handle createeven...
Windows核心程式設計學習八 事件核心物件
注 原始碼為學習 windows核心程式設計 的一些嘗試,非原創。若能有助於一二訪客,幸甚。檔案 handshake.cpp 描述 學習 windows核心程式設計 當客戶端提交請求到伺服器時觸發的事件核心物件 handle g hevtrequestsubmitted 當伺服器端完成操作返回結果給...