C++ 事件(event)使用总结

举报
AI浩 发表于 2021/12/23 00:21:32 2021/12/23
【摘要】   事件最常用在多线程同步互斥机制。  常用的函数有:  1、CreateEvent 创建事件。 函数原型如下所示,一共四个参数: HANDLE CreateEvent(  LPSECURITY_ATTRIBUTES lpEventAttributes, // SECURITY_ATTRIBUTE...

  事件最常用在多线程同步互斥机制。

 常用的函数有:

 1、CreateEvent 创建事件。

函数原型如下所示,一共四个参数:

HANDLE CreateEvent(

 LPSECURITY_ATTRIBUTES lpEventAttributes, // SECURITY_ATTRIBUTES结构指针,可为NULL
 BOOL bManualReset,     // 手动/自动
                                     // TRUE:表示手动,在WaitForSingleObject后必须手动调用ResetEvent清除信号
                                    // FALSE:表示自动,在WaitForSingleObject后,系统自动清除事件信号
 BOOL bInitialState,        //初始状态,FALSE为无信号,TRUE为有信号
 LPCTSTR lpName         //事件的名称
    );

2、SetEvent:设置为激活触发状态。

3、ResetEvent:设置为未激活触发状态。

4、WaitForSingleObject:检测信号,如果未激活,代码就会处于挂起状态,不再往下执行。

下面是多线程同步的示例:


  
  1. #include <tchar.h>
  2. #include <iostream>
  3. #include <wtypes.h>
  4. using namespace std;
  5. DWORD WINAPI ThreadProc(LPVOID lpParam);
  6. DWORD WINAPI ThreadProc2(LPVOID lpParam);
  7. DWORD g_dwThreadID;
  8. DWORD g_dwThreadID2;
  9. UINT g_nTickets = 300;
  10. HANDLE g_hEvent1 = NULL;
  11. HANDLE g_hEvent2 = NULL;
  12. CRITICAL_SECTION g_cs;
  13. int ThreadCout = 0;
  14. int main(int argc, _TCHAR* argv[])
  15. {
  16. cout << "Main thread is running." << endl;
  17. InitializeCriticalSection(&g_cs);//初始化临界区
  18. HANDLE hHandle = CreateThread(NULL, 0, ThreadProc, NULL, 0, &g_dwThreadID);
  19. ThreadCout++;
  20. HANDLE hHandle2 = CreateThread(NULL, 0, ThreadProc2, NULL, 0, &g_dwThreadID2);
  21. ThreadCout++;
  22. g_hEvent1 = CreateEvent(NULL, FALSE, TRUE, NULL); //备注5:g_hEvent1 = CreateEvent(NULL, TRUE, TRUE, NULL);
  23. g_hEvent2 = CreateEvent(NULL, FALSE, TRUE, NULL); //备注5:g_hEvent2 = CreateEvent(NULL, TRUE, TRUE, NULL);
  24. ResetEvent(g_hEvent1);
  25. ResetEvent(g_hEvent2);
  26. SetEvent(g_hEvent1);
  27. while (TRUE)
  28. {
  29. EnterCriticalSection(&g_cs);
  30. int nCount = ThreadCout;
  31. LeaveCriticalSection(&g_cs);
  32. if (nCount == 0)
  33. {
  34. cout << "Main break" << endl;
  35. break;
  36. }
  37. }
  38. Sleep(1000); //备注4
  39. CloseHandle(hHandle);
  40. CloseHandle(hHandle2);
  41. DeleteCriticalSection(&g_cs);
  42. cout << "Main End " << endl;
  43. system("pause");
  44. return 0;
  45. }
  46. DWORD WINAPI ThreadProc(LPVOID lpParam)
  47. {
  48. while (TRUE)
  49. {
  50. WaitForSingleObject(g_hEvent1, INFINITE);
  51. cout << "线程1:" << g_dwThreadID << " thread is running." << endl;
  52. EnterCriticalSection(&g_cs);
  53. int temp = g_nTickets;
  54. LeaveCriticalSection(&g_cs);
  55. cout << "线程1:" << g_dwThreadID << " thread is temp." << endl;
  56. if (temp > 0)
  57. {
  58. Sleep(100); //Sleep(1000)
  59. cout << "线程1:" << g_dwThreadID << " sell ticket : " << temp << endl;
  60. EnterCriticalSection(&g_cs);
  61. g_nTickets--;
  62. LeaveCriticalSection(&g_cs);
  63. SetEvent(g_hEvent2);
  64. }
  65. else
  66. {
  67. cout << "线程1 break" << endl;
  68. SetEvent(g_hEvent2);//没有这个ThreadProc2不能终止
  69. break;
  70. }
  71. }
  72. EnterCriticalSection(&g_cs);
  73. ThreadCout--;
  74. LeaveCriticalSection(&g_cs);
  75. cout << "线程1 end" << endl;
  76. return 0;
  77. }
  78. DWORD WINAPI ThreadProc2(LPVOID lpParam)
  79. {
  80. while (TRUE)
  81. {
  82. WaitForSingleObject(g_hEvent2, INFINITE);
  83. cout << "线程2: " << g_dwThreadID2 << " thread is running." << endl;
  84. EnterCriticalSection(&g_cs);
  85. int temp = g_nTickets;
  86. LeaveCriticalSection(&g_cs);
  87. if (temp > 0)
  88. {
  89. Sleep(100); //Sleep(1000) //备注2
  90. cout << "线程2:" << g_dwThreadID2 << " sell ticket : " << temp << endl;
  91. EnterCriticalSection(&g_cs);
  92. g_nTickets--;
  93. LeaveCriticalSection(&g_cs);
  94. SetEvent(g_hEvent1);
  95. }
  96. else
  97. {
  98. cout << "线程2 break" << endl;
  99. SetEvent(g_hEvent1);//同样的问题,没有这个ThreadProc不能终止
  100. break;
  101. }
  102. }
  103. EnterCriticalSection(&g_cs);
  104. ThreadCout--;
  105. LeaveCriticalSection(&g_cs);
  106. cout << "线程2 end" << endl;
  107. return 0;
  108. }

执行结果如下图:

文章来源: wanghao.blog.csdn.net,作者:AI浩,版权归原作者所有,如需转载,请联系作者。

原文链接:wanghao.blog.csdn.net/article/details/108380956

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。