C++事件内核对象

C++事件内核对象

2023年6月22日发(作者:)

C++事件内核对象事件内核对象包括⼈⼯重置的事件和⾃动重置的事件。⼈⼯重置事件:当⼈⼯重置事件得到通知时,等待该事件的所有线程成为可调度线程;它没有成功等待的副作⽤⾃动重置事件:当⾃动重置事件得到通知时,等待该事件的线程中只有⼀个变为可调度线程。其成功等待的副作⽤是该事件对象⾃动重置为未通知状态。事件内核对象通过createevent创建,初始可以是通知或未通知状态,setevent将事件改为已通知状态,resetevent将事件设为未通知状态。当⼀个线程执⾏初始化操作,然后通知另⼀个线程执⾏剩余的操作时,经常使⽤⼈⼯事件对象。另外如果⼀个写线程,多个读线程,可以让写线程完成写操作时通过⼈⼯事件通知读线程读取数据。⽽⾃动事件对象则可以⽤于保护资源在同⼀时间只有⼀个线程可以访问,因为它保证只有⼀个线程激活。⽰例1:⼈⼯重置事件// 使⽤⼈⼯重置事件,线程间同步#include #include #include using namespace std;int Ticket = 100;HANDLE hdl = nullptr;unsigned int __stdcall fun1(LPVOID lpParameter){ while (Ticket > 0) { WaitForSingleObject(hdl, INFINITE);//等待事件已通知状态 ResetEvent(hdl);//等到信号后,⽴刻将事件设置为未通知状态 Sleep(1);//这⾥sleep⼀下,确保其他线程处于等待状态 printf("fun1 %dn",Ticket--); SetEvent(hdl);//执⾏完毕后,⽴刻将事件设置为已通知状态 Sleep(1);//这⾥sleep⼀下,确保该线程下⼀次不会抢到执⾏权。 } return 0;}unsigned int __stdcall fun2(LPVOID lpParameter){ while (Ticket > 0) { WaitForSingleObject(hdl, INFINITE);//等待事件已通知状态 ResetEvent(hdl);//等到信号后,⽴刻将事件设置为未通知状态 Sleep(1); printf("fun2 %dn", Ticket--); SetEvent(hdl);//执⾏完毕后,⽴刻将事件设置为已通知状态 Sleep(1);//这⾥sleep⼀下,确保该线程下⼀次不会抢到执⾏权。 } return 0;}int main(){ // 创建事件:⼈⼯重置,初始为未通知状态 hdl = CreateEvent(nullptr, TRUE, FALSE, NULL); SetEvent(hdl);//设置事件有信号状态 // 创建线程 HANDLE hThread[2] = { 0 }; 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){ while (Ticket > 0) { WaitForSingleObject(hdl, INFINITE);//等待事件已通知状态 Sleep(1);//这⾥sleep⼀下,确保其他线程处于等待状态,此时事件已经⾃动重置为未通知状态 printf("fun1 %dn",Ticket--); SetEvent(hdl);//执⾏完毕后,⽴刻将事件设置为已通知状态 Sleep(1);//这⾥sleep⼀下,确保该线程下⼀次不会抢到执⾏权。 } return 0;}unsigned int __stdcall fun2(LPVOID lpParameter){ while (Ticket > 0) { WaitForSingleObject(hdl, INFINITE);//等待事件已通知状态 Sleep(1); printf("fun2 %dn", Ticket--); SetEvent(hdl);//执⾏完毕后,⽴刻将事件设置为已通知状态 Sleep(1);//这⾥sleep⼀下,确保该线程下⼀次不会抢到执⾏权。 } return 0;}int main(){ // 创建事件:⼈⼯重置,初始为未通知状态 hdl = CreateEvent(nullptr, FALSE, FALSE, NULL); SetEvent(hdl);//设置事件有信号状态 // 创建线程 HANDLE hThread[2] = { 0 }; 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;}运⾏结果:

发布者:admin,转转请注明出处:http://www.yc00.com/web/1687425782a9141.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信