windows原生条件变量支持

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

cpp 复制代码
#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;
}
相关推荐
Akiyama_Mio-Kon3 小时前
2026 最新:Dify 本地 Docker 部署完整教程(Windows + Git Bash)
windows·git·docker
千谦阙听3 小时前
C++类和对象(中):默认成员函数、构造与析构、拷贝构造、运算符重载
开发语言·c++·学习
霸道流氓气质4 小时前
Spring AI 输出解析器进阶
人工智能·windows·spring
weixin_307779134 小时前
一维无粘 Burgers 方程的激波形成问题:MacCormack 格式求解
c++·算法·matlab
HugoStudio_SWAN4 小时前
洛谷 B4500 / B4449 / B3843 凯撒密码、密码强度与密码合规——加密与安全的三道门
c++·学习·程序人生·算法·安全
雾里看山5 小时前
源码目录、构建目录与 out-of-source build
c++·软件构建·cmake
黄一一9112436 小时前
跨平台视频图片压缩互转!离线视频压缩工具!Github开源轻松无损压缩视频!Win/Mac/Linux三端通用开源工具
windows·macos·音视频·开源软件
渡我白衣7 小时前
并查集:基础认识与模拟实现
android·java·javascript·数据结构·c++·算法·并查集
如意猴7 小时前
【C++】001--C++入门(1)
开发语言·c++
hetao17338377 小时前
2026-09-01~09-04 hetao1733837 的刷题记录
c++·算法