ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++条件变量

2022-01-13 14:31:47  阅读:165  来源: 互联网

标签:tasks 变量 guard C++ include pTask Task 条件 NULL


#include <thread>
#include <mutex>
#include <condition_variable>
#include <list>
#include <iostream>
class Task
{
public:
    Task(int taskID)
    {
        this->taskID = taskID;
    }
    void doTask()
    {
        std::cout << "handle a task, taskID: " << taskID << ", threadID: " << std::this_thread::get_id() << std::endl;
    }
private:
    int taskID;
};
std::mutex mymutex;
std::list<Task*> tasks;
std::condition_variable mycv;
void* consumer_thread()
{
    Task* pTask = NULL;
    while (true)
    {
        std::unique_lock<std::mutex> guard(mymutex);
        while (tasks.empty())
        {
            //如果获得了互斥锁,但是条件不合适的话,pthread_cond_wait 会释放锁,不往下执行
            //当发生变化后,条件合适, pthread_cond_wait 将直接获得锁
                
            mycv.wait(guard);
        }
        pTask = tasks.front();
        tasks.pop_front();
        if (pTask == NULL)
            continue;
        pTask->doTask();
        delete pTask;
        pTask = NULL;
    }
    return NULL;
}
void* producer_thread()
{
    int taskID = 0;
    Task* pTask = NULL;
    while (true)
    {
        pTask = new Task(taskID);
        {
            std::lock_guard<std::mutex> guard(mymutex);//使用括号减小 guard 锁的作用范围
            tasks.push_back(pTask);
            std::cout << "produce a task, taskID: " << taskID << ", threadID: " << std::this_thread::get_id() << std::endl;
        }
        //释放信号量,通知消费者线程
        mycv.notify_one();
        taskID++;
        //休眠 1 秒
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
    return NULL;
}
int main()
{//创建 5 个消费者线程
    std::thread consumer1(consumer_thread);
    std::thread consumer2(consumer_thread);
    std::thread consumer3(consumer_thread);
    std::thread consumer4(consumer_thread);
    std::thread consumer5(consumer_thread);
    //创建一个生产者线程
    std::thread producer(producer_thread);
    producer.join();
    consumer1.join();
    consumer2.join();
    consumer3.join();
    consumer4.join();
    consumer5.join();
    return 0;
}

 

标签:tasks,变量,guard,C++,include,pTask,Task,条件,NULL
来源: https://www.cnblogs.com/pandai/p/15797514.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有