20.事件通信实现进程中介者模式通话(临界区操作数据)

  • 运行截图
  • 创建事件
    1 HANDLE event[4] = { 0 };//事件
  • 创建线程
    1 HANDLE hthread[3] = {0};//代表线程
  • 创建临界区
    CRITICAL_SECTION  cs;
  • 创建聊天缓冲区
    1 volatile char str[1024] = { 0 };//代表聊天内容的缓冲区

完整代码

  1 #define _CRT_SECURE_NO_WARNINGS
  2 #include <Windows.h>
  3 #include <stdio.h>
  4 #include <stdlib.h>
  5 #include <memory.h>
  6 
  7 //事件
  8 HANDLE event[4] = { 0 };
  9 //线程
 10 HANDLE hthread[3] = { 0 };
 11 //创建临界区
 12 CRITICAL_SECTION cs1;
 13 
 14 char str[1024] = { 0 };//代表聊天内容的缓冲区
 15 
   //中间者 16 DWORD WINAPI zhong(void *p) 17 { 18 int i = 0; 19 while (++i) 20 { 21 //等待boy发送的事件0再继续执行 22 WaitForSingleObject(event[0], INFINITE); 23 ResetEvent(event[0]); 24 EnterCriticalSection(&cs1); 25 printf("%s ", str); 26 LeaveCriticalSection(&cs1); 27 28 //发送事件1 29 SetEvent(event[1]); 30 31 32 //等待girl发送的事件2再继续执行 33 WaitForSingleObject(event[2], INFINITE); 34 ResetEvent(event[2]); 35 EnterCriticalSection(&cs1); 36 printf("%s ", str); 37 LeaveCriticalSection(&cs1); 38 //发送事件3 39 SetEvent(event[3]); 40 41 Sleep(1000); 42 } 43 } 44 45 DWORD WINAPI boy(void *p) 46 { 47 int i = 0; 48 while (++i) 49 { 50 EnterCriticalSection(&cs1); 51 memset(str, '', 1024); 52 sprintf(str, "boy第%d次说: i love you girl", i); 53 LeaveCriticalSection(&cs1); 54 55 //发送事件0 56 SetEvent(event[0]); 57 58 //等待中间者发送的事件3再执行 59 WaitForSingleObject(event[3], INFINITE); 60 ResetEvent(event[3]); 61 62 Sleep(1000); 63 } 64 return 0; 65 } 66 67 DWORD WINAPI girl(void *p) 68 { 69 int i = 0; 70 while (++i) 71 { 72 //等待中间人发送的事件1 73 WaitForSingleObject(event[1], INFINITE); 74 ResetEvent(event[1]); 75 76 EnterCriticalSection(&cs1); 77 memset(str, '', 1024); 78 sprintf(str, "girl第%d次说: i love you boy", i); 79 LeaveCriticalSection(&cs1); 80 81 82 //发送事件2 83 SetEvent(event[2]); 84 85 Sleep(1000); 86 } 87 return 0; 88 } 89 90 void main() 91 { 92 InitializeCriticalSection(&cs1); 93 event[0] = CreateEvent(NULL, TRUE, FALSE, NULL);//第二个参数代表是否自动复位,TRUE表示手动复位需要reset,FALSE表示自动复位,不需要reset
                                 //第三个参数是信号的状态,第四个参数代表信号的名字
94 event[1] = CreateEvent(NULL, TRUE, FALSE, NULL); 95 event[2] = CreateEvent(NULL, TRUE, FALSE, NULL); 96 event[3] = CreateEvent(NULL, TRUE, FALSE, NULL); 97 98 hthread[0] = CreateThread(NULL, 0, boy, NULL, 0, NULL); 99 hthread[1] = CreateThread(NULL, 0, girl, NULL, 0, NULL); 100 hthread[2] = CreateThread(NULL, 0, zhong, NULL, 0, NULL); 101 102 103 WaitForMultipleObjects(2, hthread, TRUE, INFINITE); 104 }
原文地址:https://www.cnblogs.com/xiaochi/p/8406846.html