概述
条件变量是限制线程执行的一种机制,即在某些条件满足之前限制线程的执行。这种限制的目的,大多是为了减少线程之间信息闭塞,达到线程同步,从而提高线程之间的通信效率。
线程中访问共享数据的代码常常带有一定的逻辑顺序(如数据的添加和删除)。而条件变量的目的就是将这些线程之间的代码的执行与逻辑顺序相吻合,从而避免线程不断的if判断是否达到执行要求。举个贴近的生活,你和你的好兄弟一起请求班上的好学生帮你们写作业,你好兄弟的作业先写,然后再写你的,着急的你一直询问好学生是不是轮到你了,这样会不会让好学生很烦!!!因此就应该等你的好兄弟拿到作业后再由他通知你该你的作业了。
std::condition_variable
std::condition_variable(条件变量)是C++11引入的一个类,通常与互斥量一起使用,确保共享数据安全并同步线程。使用std::condition_variable要使用#include<condition_variable>将头文件包含进来。
std::condition_variable主要通过wait()、notify_one()、notify_all()三个成员实现以上功能。wait()可以接收一个shared_lock<std::mutex>类型的参数,当线程执行到std::condition_variable成员调用wait()时,线程就会被阻塞到本行代码,同时释放锁。等待其他线程调用notify_one()通知其可以继续执行,或者调用notify_all()通知所有被该条件变量阻塞的线程继续执行。当wait()被唤醒后,就会不断尝试获取锁。直到获得锁后,才会执行后续代码。如果线程并未被阻塞或者并未被wait()阻塞,其他线程调用notify_one()或者notify_all()对其不起作用。
#include<iostream>
#include<thread>
#include<list>
#include<mutex>
#include<condition_variable>
using namespace std;
class A
{
private:mutex mymutex;list<int> mydata;condition_variable mycond;
public:void indata(){for (int i = 0; i < 1000; i++){unique_lock<mutex> mylock(mymutex);mydata.push_back(i);mycond.notify_one();}}void outdata(){for (int i = 0; i < 1000; i++){unique_lock<mutex> mylock(mymutex);mycond.wait(mylock);mydata.pop_front();}}
};int main()
{A a;thread myinthread(&A::indata ,&a );thread myoutthread(&A::outdata,&a);myinthread.join();myoutthread.join();}