编程语言
首页 > 编程语言> > C++条件变量

C++条件变量

作者:互联网

#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