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;
}
相关推荐
2401_8414956419 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
fqbqrr20 小时前
2607C++,soui与安卓
c++·soui
fqbqrr1 天前
2607C++,使用微软detours勾挂工具
c++
蓝悦无人机1 天前
C++基础 — 函数总结
开发语言·c++
糖果店的幽灵1 天前
langgraph的 MessagesState 解读
java·开发语言·人工智能·windows·langgraph
骑上单车去旅行1 天前
MD5校验对比脚本
linux·服务器·windows
我不是懒洋洋1 天前
从零实现一个分布式监控:Prometheus的核心设计
c++
An_s1 天前
c++对接pdfium(一)win系统篇
开发语言·c++
众少成多积小致巨1 天前
C++ 规范参考(上)
c++
FreeBuf_1 天前
Windows NT OS内核提权漏洞PoC已公开
windows