c++ 线程条件变量

此处有两个线程,一个作为生产者,把数据放入队列中,一个作为消费者,把数据从队列中取出,所以对两个线程而言,这个队列是共用的,所以要加锁进行保护。

#include "stdafx.h"
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <deque>
using namespace std;

std::mutex mt;
std::condition_variable cv;
std::deque<int> q;

void producer()
{
    int data = 10;while (data > 0)
    {
        std::unique_lock<std::mutex> lck(mt);
        q.push_front(data);  //向队列中添加数据
        lck.unlock();
        cv.notify_one();    //唤醒一个休眠的线程
        std::this_thread::sleep_for(std::chrono::seconds(1));
        data--;
    }
}

void consumer()
{
    int data = 0;while (data != 1)
    {
        std::unique_lock<std::mutex> lck(mt);
        while (q.empty())
        {
            cv.wait(lck);  //如果队列为空,让线程处于等待休眠状态
        }
        data = q.back();
        q.pop_back();
        lck.unlock();
        std::cout << data << " " << std::endl;
    }
}

int main()
{
    std::thread th(producer);
    th.join();
    std::thread th1(consumer);
    th1.join();
    getchar();
    return 0;
}

输出结果:

10
9
8
7
6
5
4
3
2
1

如果不使用线程条件变量,由于消费者存在while函数,那么消费者的线程函数会一直的运行,这样会十分的消耗资源,所以加了条件变量,如果条件不满足那么线程就处于等待休眠状态,直到条件满足,才会唤醒线程来执行下面的操作,这样可以有效的避免资源浪费的情况。

猜你喜欢

转载自www.cnblogs.com/caozewen/p/12193127.html