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

简介: 按书上的代码调不出来,无错,但是空白。 于是,我只好加了一个WaitSingleObject, 结果,只能显示截断的字符,于是调协好 Character Set,才一切OK。 线程间同步,进程间通信,内存分配。

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

于是,我只好加了一个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 }

 

目录
相关文章
|
存储 安全 对象存储
手把手教你搭建阿里云图床(PicGo+Typora+阿里云OSS),新手小白一看就会
本文详细介绍了怎样帮助新手小白从注册,购买阿里云OSS,到一步一步配置OSS做为图床,和PicGo、Typora软件连接,配置好关联之后,在使用Typora写文章时,如果需要插入图片,只需要将图片复制粘贴到Typora的编辑区域,就会自动通过PicGo上传到指定图床,自动复制外网能访问的URL并展示,简直不要太方便,极大的解决了编辑文章时复制处理图片链接的痛点。
8766 14
手把手教你搭建阿里云图床(PicGo+Typora+阿里云OSS),新手小白一看就会
|
8月前
|
Java 测试技术 应用服务中间件
Spring Boot 配置文件总结
Spring Boot 提供全局配置文件 `application.properties` 和 `application.yml`,用于修改自动配置的默认值。前者使用键值对配置,后者使用缩进和冒号。不同环境(开发、测试、生产)可切换配置文件,通过 `spring.profiles.active` 指定。例如,开发环境端口为4790,测试环境为4791,生产环境为4792。配置示例展示了属性、List、Map定义及引用方法。
227 14
|
6月前
|
并行计算 Ubuntu Docker
kTransformers DeepSeek R1 部署全流程指南
kTransformers DeepSeek R1 部署全流程指南
|
数据安全/隐私保护
借助Gitee将typora图片上传CSDN
借助Gitee将typora图片上传CSDN
|
算法 Java 程序员
同步与互斥(二)
同步与互斥(二)
276 0
|
JSON 前端开发 JavaScript
Json格式化
Json格式化
|
运维 安全 网络安全
DDoS攻击增速惊人,谈谈防御DDoS攻击的几大有效方法
DDoS攻击增速惊人,谈谈防御DDoS攻击的几大有效方法
348 0
|
Docker 容器
Docker Desktop 配置阿里云镜像加速
Docker Desktop 配置阿里云镜像加速
|
存储 API 对象存储
手把手教你Typora图床配置(PicGo+阿里云OSS/腾讯云COS)
手把手教你Typora图床配置(PicGo+阿里云OSS/腾讯云COS)
2833 0
|
程序员
Win10秘笈:两种方式修改网卡物理地址(MAC)
每台能够上网的电脑都有网卡,不管是有线还是无线,网卡本身都得有物理地址,也就是MAC(Media Access Control 或 Medium Access Control)地址。
5715 0