尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

windows原生条件变量支持

windows原生条件变量支持
📅 发布时间:2026/7/5 9:16:43

在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; }

相关新闻

  • 社区贡献指南:如何参与chaosArsenal-hardware开源项目开发
  • Docker部署openEuler talent-assessment平台:简单高效的环境搭建教程
  • 逆向工程实战:从二进制文件解析到自定义格式逆向分析

最新新闻

  • 终极指南:3步掌握unluac Lua反编译工具完整教程
  • 技术解构:N_m3u8DL-RE 流媒体协议解码引擎实现路径
  • AI全栈开发环境搭建与实战指南
  • Dify 1.15 人工介入功能详解:构建可控AI工作流实战指南
  • AI公式识别插件:提升论文写作效率的利器
  • Dify 1.15 人工介入功能实操:AI工作流人机协同配置指南

日新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

周新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号