利用单事件对象进行线程同步

本文详细介绍了如何通过Windows API中的Event机制实现多线程间的同步和通信,包括创建Event、线程函数设计以及共享内存操作等关键步骤。通过实例代码演示了如何利用Event来协调多个线程的执行顺序,确保多线程程序的正确性和高效运行。
摘要由CSDN通过智能技术生成

按书上的代码调不出来,无错,但是空白。

于是,我只好加了一个WaitSingleObject,

结果,只能显示截断的字符,于是调协好 Character Set,才一切OK。

线程间同步,进程间通信,内存分配。这差不多算是系统编程的三大重点了。

涉及了内存,CPU。

  1 /* ************************************
  2 *《精通Windows API》 
  3 * 示例代码
  4 * Event.c
  5 * 7.2.1  演示使用Event同步线程
  6 **************************************/
  7 
  8 /* 头文件 */
  9 #include <windows.h>
 10 #include <stdio.h>
 11 /* 常量定义 */
 12 #define NUMTHREADS    3 
 13 #define BUFFER_SIZE    16
 14 #define FOR_TIMES    5
 15 /* 全局变量 */
 16 HANDLE hEvent;    
 17 HANDLE hThread; // 用于同步
 18 BYTE lpSharedBuffer[16] = {0};    // 共享内存
 19 /* 函数声明 */
 20 void UseEvents(void);
 21 DWORD WINAPI EventFunction(LPVOID lpParam);
 22 
 23 /*************************************
 24 * int main(void)
 25 * 功能    演示
 26 *
 27 * 参数    未使用
 28 **************************************/
 29 int main()
 30 {
 31 
 32     UseEvents();
 33     WaitForSingleObject(hThread, INFINITE);
 34     CloseHandle(hThread);
 35 
 36 }
 37 
 38 /*************************************
 39 * void UseEvents(void) 
 40 * 功能    演示Event的使用方法
 41 *
 42 * 参数    未使用
 43 **************************************/
 44 void UseEvents(void) 
 45 {
 46     //HANDLE hThread; 
 47 
 48     hEvent = CreateEvent( 
 49         NULL,            // 默认安全属性
 50         TRUE,            // 手工重置
 51         FALSE,            // 初始为未置位的
 52         NULL            // 未命名
 53         );
 54     // 判断是否创建成功
 55     if (hEvent == NULL) 
 56     { 
 57         printf("CreateEvent failed (%d)\n", GetLastError());
 58         return;
 59     }
 60     // 创建线程
 61     hThread = CreateThread(NULL, 0, 
 62         EventFunction, 
 63         NULL,
 64         0, NULL); 
 65     if (hThread == NULL) 
 66     {
 67         printf("CreateThread failed (%d)\n", GetLastError());
 68         return;
 69     }    
 70     Sleep(200); // 可以做一些其他处理
 71     // 向共享内存中复制数据
 72     CopyMemory(lpSharedBuffer,"Event",lstrlen("Event"));
 73     // 设置 Event 使ThreadFunction线程可以开始复制数据
 74     SetEvent(hEvent);
 75 }
 76 
 77 /*************************************
 78 * DWORD WINAPI EventFunction(LPVOID lpParam)
 79 * 功能    线程函数,读共享内存
 80 *
 81 * 参数    未使用
 82 **************************************/
 83 DWORD WINAPI EventFunction(LPVOID lpParam) 
 84 {
 85     DWORD dwWaitResult;
 86     // 等待,直到事件被置位
 87     dwWaitResult = WaitForSingleObject( 
 88         hEvent,            // Event 句柄
 89         INFINITE);        // 无限等待
 90     if (dwWaitResult != WAIT_OBJECT_0) 
 91     {
 92         printf("Wait error: %d\n", GetLastError()); 
 93         return 0;
 94     }
 95     // 读共享内存
 96     printf(lpSharedBuffer);
 97     printf("\nlpSharedBuffer");
 98     // 重置事件
 99     if (! ResetEvent(hEvent) ) 
100     { 
101         printf("SetEvent failed (%d)\n", GetLastError());
102         return 0;
103     }
104     return 1;
105 }

 

转载于:https://www.cnblogs.com/aguncn/archive/2013/04/01/2993816.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值