windows C++ 互相等待线程同步示例
2015-05-11 17:22
246 查看
windows C++ 互相等待线程同步示例
开发中遇到线程同步问题,可抽象为如下模型:
1、主线程的继续执行的前提是子线程的变量已经初始化完毕。
2、子线程待主线程执行完毕后继续执行后续的初始化操作。
重复1,2执行……直到通信结束。
如下图所示:
源码(VS2010编译、运行通过)
本质抽象为:事件同步机制。和sunxin教程的火车票模型基本完全一致。
【反思】
1.当遇到复杂的逻辑,如:通信复杂、调用混乱,一定要先把思路梳理清楚;
2.当复杂的程序无法进行全局测试的时候,可以考虑抽象模型为小Demo,通过小Demo测试大致框架逻辑的准确性。
2014-5-11 pm23:47 思于家中床前
作者:铭毅天下
转载请标明出处,原文地址:http://blog.csdn.net/laoyang360/article/details/45646151
如果感觉本文对您有帮助,请点击‘顶’支持一下,您的支持是我坚持写作最大的动力,谢谢!
开发中遇到线程同步问题,可抽象为如下模型:
1、主线程的继续执行的前提是子线程的变量已经初始化完毕。
2、子线程待主线程执行完毕后继续执行后续的初始化操作。
重复1,2执行……直到通信结束。
如下图所示:
源码(VS2010编译、运行通过)
#include "stdafx.h" #include <iostream> using namespace std; #include <windows.h> const char* g_pszEventName = "GLOBAL/MY_EVENT"; //事件对象的名称 HANDLE g_hSetTaskIdEvent = NULL; //全局Event事件 const int g_iMaxRunCnt = 50; //最大的运行次数. /* **@brief:模拟线程函数。 **@param:LPVOID pParam 线程参数,未使用(可传递结构体指针等) **@return 0,ok; 其他代表异常退出。 */ UINT RecvDataThreadProc(LPVOID pParam) { cout << "The RecvDataThreadProc() is Running!" << endl; int nThreadCnt = 0; while(nThreadCnt < g_iMaxRunCnt) { printf("[Thread] The TaskId already Setted! RunCnt = %d\n", nThreadCnt++); SetEvent(g_hSetTaskIdEvent); //触发,主线程可以运行. WaitForSingleObject(g_hSetTaskIdEvent, INFINITE); } return 0; } /* **@brief:主线程和副线程交替运行。 ** ** */ int _tmain(int argc, _TCHAR* argv[]) { // 启动一个处理线程 DWORD dwThreadId = 0; HANDLE hRecvThread = CreateThread(NULL, //Choose default security 0, //Default stack size (LPTHREAD_START_ROUTINE)&RecvDataThreadProc,//Routine to execute (LPVOID) NULL, //Thread parameter 0, //Immediately run the thread &dwThreadId //Thread Id ); if (NULL == hRecvThread) { printf("CreateThread Failed! ErrCode: %d\n", GetLastError()); return(1); } else { printf("CreateThread OK!\n"); } CloseHandle(hRecvThread); //1.创建命名的事件对象,自动且初始化为无信号状态 g_hSetTaskIdEvent= CreateEvent(NULL, FALSE, FALSE, (LPCWSTR)(g_pszEventName)); int iErrorCode = GetLastError(); if (ERROR_ALREADY_EXISTS == iErrorCode) { printf("[Process]CreateEvent() the object is already exist!\n"); } else if (NULL == g_hSetTaskIdEvent) { printf("[Process] CreateEvent() Error, Errorcode: %d\n", iErrorCode); } else { printf("[Process] CreateEvent() Success!\n"); } unsigned int nRunCnt = 0; while(nRunCnt < g_iMaxRunCnt) { bool bRunNext = false; //初始置为false,不可以执行下面的操作。 //等待信号触发 DWORD dwRst = WaitForSingleObject(g_hSetTaskIdEvent, INFINITE); switch(dwRst) { case WAIT_OBJECT_0: // The process terminated. printf("[Process]The state of the specified object is signaled.\n"); bRunNext = true; break; case WAIT_TIMEOUT: // The process did not terminate within the given milliseconds. printf("[Process]The time-out interval elapsed, and the object's state is nonsignaled.\n"); break; case WAIT_FAILED: // Bad call to function (invalid handle?) printf("[Process]WAIT_FAILED, ErrCode: %d\n", GetLastError()); break; }//end switch //主线程运行后才可以执行下面的操作. if (bRunNext) { printf("[Process] The Process() Next can running!, running cnt = %d\n", nRunCnt++); } SetEvent(g_hSetTaskIdEvent); } CloseHandle(g_hSetTaskIdEvent); return 0; }
本质抽象为:事件同步机制。和sunxin教程的火车票模型基本完全一致。
【反思】
1.当遇到复杂的逻辑,如:通信复杂、调用混乱,一定要先把思路梳理清楚;
2.当复杂的程序无法进行全局测试的时候,可以考虑抽象模型为小Demo,通过小Demo测试大致框架逻辑的准确性。
2014-5-11 pm23:47 思于家中床前
作者:铭毅天下
转载请标明出处,原文地址:http://blog.csdn.net/laoyang360/article/details/45646151
如果感觉本文对您有帮助,请点击‘顶’支持一下,您的支持是我坚持写作最大的动力,谢谢!
相关文章推荐
- 《Windows via C/C++》学习笔记 —— 内核对象的“线程同步”之“等待定时器”
- Windows Via C/C++:用户模式下的线程同步——轻量级读写锁(Slim Reader-Writer Locks)
- 《Windows via C/C++》学习笔记 —— “线程同步”之“检测死锁”
- 《Windows via C/C++》学习笔记 —— 用户模式的“线程同步”之“读写锁”
- Windows平台开启多线程简单示例(C++)
- windows笔记-【内核对象线程同步】成功等待的副作用
- windows笔记-【内核对象线程同步】等待定时器内核对象
- Windows Via C/C++:用户模式下的线程同步——Condition Variables 条件变量
- Mac OSX & Windows上如何使用SWIG (c++ android 示例)
- 《Windows via C/C++》学习笔记 —— 用户模式的“线程同步”之“互锁函数族”
- 《Windows via C/C++》学习笔记 —— 用户模式的“线程同步”之“条件变量”
- 《windows via C++》之windows线程同步
- Windows Via C/C++:用户模式下的线程同步——原子操作:Interlocked函数族
- 《Windows via C/C++》学习笔记(五) 内核对象的“线程同步”
- Windows Via C/C++:内核模式下的线程同步——事件内核对象
- c++利用windows函数实现计时示例
- C++ 经典线程同步互斥量Mutex 示例解析(十二)
- C++实现线程同步的几种方式 线程同步是指同一进程中的多个线程互相协调工作从而达到一致性。之所以需要线程同步,是因为多个线程同时对一个数据对象进行修改操作时,可能会对数据造成破坏,下面是多
- Windows Via C/C++:内核模式下的线程同步——WaitForSingleObject/WaitForMultipleObjects函数
- 《Windows via C/C++》学习笔记 —— 内核对象的“线程同步”之“事件内核对象”