此处有两个线程,一个作为生产者,把数据放入队列中,一个作为消费者,把数据从队列中取出,所以对两个线程而言,这个队列是共用的,所以要加锁进行保护。
#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函数,那么消费者的线程函数会一直的运行,这样会十分的消耗资源,所以加了条件变量,如果条件不满足那么线程就处于等待休眠状态,直到条件满足,才会唤醒线程来执行下面的操作,这样可以有效的避免资源浪费的情况。
原文:https://www.cnblogs.com/caozewen/p/12193127.html