news 2026/7/5 8:56:01

windows原生条件变量支持

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/5 8:54:56

sbom-ort进阶教程:自定义策略与自动化合规检查的最佳实践

sbom-ort进阶教程&#xff1a;自定义策略与自动化合规检查的最佳实践 【免费下载链接】sbom-tools A tools named sbom-tools, designed for generating the sbom file. 项目地址: https://gitcode.com/openeuler/sbom-tools 前往项目官网免费下载&#xff1a;https://a…

作者头像 李华
网站建设 2026/7/5 8:54:15

Navicat密码找回:3分钟解密本地加密连接配置

1. 项目概述&#xff1a;当数据库密码成为记忆盲区作为一名常年和数据库打交道的开发或运维&#xff0c;你一定遇到过这种尴尬&#xff1a;服务器上的MySQL、PostgreSQL或者Oracle跑得好好的&#xff0c;Navicat里也保存着连接配置&#xff0c;每天点一下就能连上干活。但某天需…

作者头像 李华
网站建设 2026/7/5 8:53:34

BSCCompiler代码贡献指南:如何参与开源编译器项目开发

BSCCompiler代码贡献指南&#xff1a;如何参与开源编译器项目开发 【免费下载链接】BSCCompiler BSC Compiler is an unified programming platform supporting multiple devices and languages. 项目地址: https://gitcode.com/openeuler/BSCCompiler 前往项目官网免费…

作者头像 李华
网站建设 2026/7/5 8:52:08

XUnity.AutoTranslator:打破语言壁垒的Unity游戏自动翻译终极方案

XUnity.AutoTranslator&#xff1a;打破语言壁垒的Unity游戏自动翻译终极方案 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否曾因为语言障碍而错过精彩的Unity游戏&#xff1f;是否对日文、韩文或…

作者头像 李华
网站建设 2026/7/5 8:50:39

想找靠谱景观标识厂家?这些要点助你精准锁定优质之选!

景观标识作为园林景区、市政公园等场所的重要元素&#xff0c;其品质直接影响着整体环境的美观与实用性。靠谱的景观标识厂家能打造出适配且耐用的标识&#xff0c;而寻找这类厂家可从以下几个要点着手。生产实力&#xff1a;决定供应品质与效率靠谱的景观标识厂家需有强大的生…

作者头像 李华