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

简介: 按书上的代码调不出来,无错,但是空白。 于是,我只好加了一个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 }

 

目录
相关文章
|
4月前
|
安全 Java 数据库连接
详细介绍线程间通信
详细介绍线程间通信 线程间通信是指在多线程编程中,不同的线程之间通过某种方式交换信息的过程。这是一个重要的概念,因为线程之间的协作是实现复杂并发系统的关键。 下面是一些线程间通信的常见方式和示例:
358 0
|
4月前
|
消息中间件 Linux
线程间通信
线程间通信 在并发编程中,线程之间的数据共享和信息传递是非常普遍的需求。如果没有线程间通信,多线程编程将变得毫无意义,因为这些线程无法相互协调和合作,无法完成更复杂的任务。因此,线程间通信是多线程编程中最重要的概念之一。
|
6月前
|
Java
异步编程 - 02 显式使用线程和线程池实现异步编程
异步编程 - 02 显式使用线程和线程池实现异步编程
40 0
|
11月前
|
消息中间件 监控 安全
单线程事件处理器ControllerEventManager
单线程事件处理器,Controller端定义的一个组件。该组件内置了一个专属线程,负责处理其他线程发送过来的Controller事件。还定义了一些管理方法,为专属线程输送待处理事件。
59 0
|
数据采集 C#
委托与线程在C#编程中的应用及选择
委托是一种表示对具有特定参数列表和返回类型的方法的引用的类型。可以使用委托将方法作为参数传递给其他方法,或者异步地调用方法。 线程是一个执行单元,它可以与进程中的其他线程并发运行。可以使用线程来同时执行多个任务,或者并行化计算密集型的工作。 委托和线程之间的区别在于,委托是一种引用方法的方式,而线程是一种执行方法的方式。可以使用委托在不同的线程上调用方法,要么使用委托的 BeginInvoke 和 EndInvoke 方法,要么使用 ThreadPool 或 Task 类。
|
安全 调度 数据库
Windows开发——临界区,互斥量,信号量,事件的简单介绍与区别
Windows开发——临界区,互斥量,信号量,事件的简单介绍与区别
494 0
|
Java 程序员 API
Java多线程编程之创建子线程
学习线程之前先了解一下有关的基础知识
Java多线程编程之创建子线程
C#委托及线程操作
C#委托及线程操作
118 0
C#委托及线程操作