1、头文件
#include <condition_variable>
2、作用
用于线程间的同步阿
3、条件变量的5个函数
wait 阻塞自己,等待唤醒
wait_for 阻塞自己,等待被唤醒,等待一段时间
wait_until 阻塞自己,等待唤醒,等待到某个时间点
notify_one 唤醒一个等待在这个条件变量上的线程(随机)
notify_all 唤醒所有等待在这个条件变量上的线程
4、原理
1、当std::condition_variable对象的某个wait函数被调用的时候,它使用std::unique_lock(通过 std::mutex)来锁住当前线程。当前线程会一直被阻塞,直到另外一个线程在相同std::condition_variable对象上调用了notiry函数来唤醒当前线程
2、在线程被阻塞时,该函数会自动调用lck.unlock()释放锁,使得其他被阻塞在锁竞争上的线程得以继续执行。另外,一旦当前线程获得通知(notified,通常是另外某个线程调用notify_*唤醒了当前线程),wait()函数也是自动调用lock()。
5、类似类说明
condition_variable_any:和std::condition_variable几乎完全一样。只不过std::condition_variable_any的wait函数可以接受任何lockable参数,而std::condition_variable只能接受std::unique_lock类型的参数
6、举例
#include <thread>
#include <mutex>
#include <condition_variable>
#include<iostream>
using namespace std;
using namespace std::this_thread;
using namespace std::chrono;
condition_variable cv;//仅支持unique_lock<mutex> 作为wait的参数
condition_variable_any cv2;//接受任何 lockable参数作为wait的参数
mutex m;
void ThreadFun(int id)
{
unique_lock<mutex> lck(m);
//cv.wait(lck);//等待被唤醒
cv2.wait(lck);
cout << "线程ID:" << id << "执行!" << endl;
}
int main()
{
thread t1(ThreadFun, 1);
thread t2(ThreadFun, 2);
thread t3(ThreadFun, 3);
cout << "3秒后唤醒:" << endl;
sleep_for(seconds(3));//3秒之后唤醒所有线程
//cv.notify_all();//唤醒所有
//cv.notify_one();
//cv.notify_one();
cv2.notify_all();
t1.join();
t2.join();
t3.join();
return 0;
}