多线程同步之事件 -- 2个线程交替打印数字
来源:互联网 发布:淘宝拍了不发货怎么办 编辑:程序博客网 时间:2024/05/21 11:01
有段时间没有接触多线程相关的知识了,难免会遗忘或者生疏。多线程通信和同步相关的知识运用比较广,而且比较常见。今天通过2个线程交替打印数字的例子,来整理下多线程序相关的编程方式。这里2个线程直接通过一个event进行同步。
我们通过CreateEvent函数创建一个无信号的事件。然后再线程1中通过SetEvent设置该事件为有信号。后续每个线程就是通过WaitForSingleObject函数去等待事件即可。通过交替调用ResetEvent和SetEvent,2个线程相安无事,各自按照顺序进行打印。
如果没有多线程的控制,那么打印顺序一定是不可预测的,原因是线程的调度由系统决定,某些线程函数执行了2次,可能某些线程函数才执行1次。
测试代码如下:
#include <Windows.h>#include <iostream>#include <stdlib.h>#include <process.h>using namespace std;int g_number = 0;HANDLE g_hEvent = NULL;unsigned int __stdcall threadFun1(void *param){SetEvent(g_hEvent);while(1){DWORD dwWaitResult = WaitForSingleObject(g_hEvent, INFINITE); switch (dwWaitResult) {// Event object was signaledcase WAIT_OBJECT_0: break; // An error occurreddefault: printf("Wait error (%d)\n", GetLastError()); return 0; }ResetEvent(g_hEvent);printf("threadFun1: g_number = %d\t\r\n",g_number++);Sleep(1500);SetEvent(g_hEvent);}return 0;}unsigned int __stdcall threadFun2(void *param){while(1){DWORD dwWaitResult = WaitForSingleObject(g_hEvent, INFINITE); switch (dwWaitResult) {// Event object was signaledcase WAIT_OBJECT_0: break; // An error occurreddefault: printf("Wait error (%d)\n", GetLastError()); return 0; }ResetEvent(g_hEvent);printf("threadFun2: g_number = %d\t\r\n",g_number++);Sleep(800);SetEvent(g_hEvent);}return 0;}int main(int argc,char* argv[]){g_hEvent = CreateEvent(NULL,false,false,L"Event Test1");HANDLE hThread1 = NULL;unsigned threadID1 = 0;hThread1 = (HANDLE)_beginthreadex(NULL, 0, threadFun1, NULL, 0, &threadID1);HANDLE hThread2 = NULL;unsigned threadID2 = 0;hThread2 = (HANDLE)_beginthreadex(NULL, 0, threadFun2, NULL, 0, &threadID2);while(1);return 0;}编译运行代码,结果如下:
0 0
- 多线程同步之事件 -- 2个线程交替打印数字
- 2个线程交替打印
- 多线程交替打印数字
- 多线程交替打印数字
- 两线程交替打印数字
- 经典线程同步问题之3个线程交替数数
- java多线程交替打印数字和字母
- linux两个线程交替打印数字
- 多线程同步 顺序打印数字 线程条件变量
- 多线程编程实例----线程同步之事件
- 面试题一:实现两个线程交替打印数字
- 2.使用线程实现数字与代码的交替打印
- 线程交替打印
- Java 多线程 子线程 交替打印 奇偶数
- 多线程技术: 两个线程交替打印奇数和偶数
- 多线程20个奇偶数一组交替打印
- 多线程之线程同步
- 多线程之线程同步
- 河南省第九届ACM程序设计大赛 信道安全 nyist
- IO流的基本使用
- JAVA面试题一
- django 1.9.7学习笔记(1)
- 如何更改通达OA附件的存储目录
- 多线程同步之事件 -- 2个线程交替打印数字
- Robot FrameWork自动测试之入门范例
- 拯救2K屏手机!修改屏幕分辨率省电教程
- C/C++程序实现通过http代理访问网页内容
- Ubuntu每次打开终端出现错误提示的解决方法
- 高性能计算中心汇总(原创)
- [51nod 1766]树上的最远点对
- CSS Secret——Visual Effect
- 欢迎使用CSDN-markdown编辑器