当前位置: 首页 > news >正文

windows原生条件变量支持

在windows vista 及后续的版本(Win7,Win8,Win10,Win11)中提供了对条件变量的原生支持(2006.11),为多线程程序开发带来便利。

#include <Windows.h> #include <iostream> #include <list> SRWLOCK myRwLock = SRWLOCK_INIT; CRITICAL_SECTION myCriticalSection; CONDITION_VARIABLE myConditionVar; class Task; std::list<Task*> tasks; class Task { public: Task(int taskID) { this->taskID = taskID; } void doTask() { std::cout << "handle a task, taskID: " << taskID << ", threadID: " << GetCurrentThreadId() << std::endl; } private: int taskID; }; DWORD WINAPI consumerThread(LPVOID param) { Task* pTask = NULL; while (true) { //AcquireSRWLockExclusive(&myRwLock); EnterCriticalSection(&myCriticalSection);//进入临界区 while (tasks.empty()) { //SleepConditionVariableSRW(&myConditionVar, &myRwLock, INFINITE, 0);//Flag 0:Exclusive 1:Shared,等待期间释放锁,退出等待时再次加锁 SleepConditionVariableCS(&myConditionVar, &myCriticalSection, INFINITE); //等待期间离开临界区,退出等待时再次进入临界区 } pTask = tasks.front(); tasks.pop_front(); LeaveCriticalSection(&myCriticalSection); //ReleaseSRWLockExclusive(&myRwLock); if (pTask == NULL) continue; pTask->doTask(); delete pTask; pTask = NULL; } return 0; } DWORD WINAPI producerThread(LPVOID param) { int taskID = 0; Task* pTask = NULL; while (true) { pTask = new Task(taskID); //AcquireSRWLockExclusive(&myRwLock); EnterCriticalSection(&myCriticalSection);//进入临界区 tasks.push_back(pTask); std::cout << "produce a task, taskID: " << taskID << ", threadID: " << GetCurrentThreadId() << std::endl; LeaveCriticalSection(&myCriticalSection);//离开临界区 //ReleaseSRWLockExclusive(&myRwLock); WakeConditionVariable(&myConditionVar); taskID++; //休眠1秒 Sleep(1000); } return 0; } int main() { //初始化读写锁,也可以用读写锁配合条件变量使用 //InitializeSRWLock(&myRwLock); //初始化临界区,本例使用临界区搭配条件变量 InitializeCriticalSection(&myCriticalSection); //初始化条件变量 InitializeConditionVariable(&myConditionVar); //创建5个消费者线程 HANDLE consumerThreadHandles[5]; for (int i = 0; i < 5; ++i) consumerThreadHandles[i] = CreateThread(NULL, 0, consumerThread, NULL, 0, NULL); //创建一个生产者线程 HANDLE producerThreadHandle = CreateThread(NULL, 0, producerThread, NULL, 0, NULL); //等待生产者线程退出 WaitForSingleObject(producerThreadHandle, INFINITE); //等待消费者线程退出 for (int i = 0; i < 5; ++i) WaitForSingleObject(consumerThreadHandles[i], INFINITE); DeleteCriticalSection(&myCriticalSection); return 0; }
http://www.jsqmd.com/news/1127273/

相关文章:

  • MATLAB图形化图像水印工具:支持DCT/DWT嵌入提取与攻击测试
  • 「 简记往来」第十八篇:云服务器部署——从购买到上线的完整流程
  • 3大发现:如何让NVIDIA Profile Inspector说中文,解锁显卡隐藏设置的语言奥秘
  • 07.03.每日总结
  • Docker部署openEuler talent-assessment平台:简单高效的环境搭建教程
  • DyscheOS-utils高级用法:动态资源迁移与多分区协同工作模式
  • 逆向工程实战:从二进制文件解析到自定义格式逆向分析
  • 如何用Scarab模组管理器轻松玩转空洞骑士MOD世界?
  • 工业预诊:06 品牌大乱斗:GE、西门子、国产
  • 告别百度网盘提取码焦虑:5秒智能破解的现代解决方案
  • Ceph容器化部署开发:openeuler/ceph_dev中Docker与Kubernetes集成
  • 希沃V20 AI学习机深度评测:AI精准学与专注学习系统如何重塑家庭学习环境
  • 实战案例:如何用容度原理设计一篇“Nature级别”实验
  • 商业数据分析实战:从五大核心系统到端到端项目全流程
  • GRPO训练燃料:把Hermes Agent Feedback变成强化学习信号
  • sbom-tools常见问题解答:解决使用过程中的20个典型问题
  • 龍魂系统入口一致性协议
  • openEuler/btfhub与原生BTFHub对比分析:为何openEuler需要自己的BTF解决方案
  • markword在高并发场景下变化剖析
  • DC-DC降压转换器设计与STM32控制实现
  • 3步搞定游戏语言障碍:开源自动化翻译解决方案完全指南
  • sbom-tools API参考:如何集成到你的CI/CD流水线
  • 云安全密钥管理实战:从RAM角色到KMS加密的合规架构
  • 如何为Unity游戏打造智能翻译系统:XUnity.AutoTranslator完全指南
  • CTinspector企业级部署方案:大规模集群下的流量检测架构设计
  • YOLO模型如何训练 -AI避障识别之红外目标检测数据集 红外小目标检测数据集 红外车辆行人识别数据集 Yolo格式数据集 第10217期
  • pyTelegramBotAPI:写 Telegram 机器人最省事的 Python 库
  • BSCCompiler静态代码分析:使用clang-tidy提升代码质量的完整指南
  • 一个根据中文拼写英语句子的小项目-英语句练
  • Ceph文件系统开发全攻略:openeuler/ceph_dev中CephFS架构解析