条件变量(condition_variable)

一、定义:
1.1、解释:

条件变量是利用线程间共享的变量进行同步的一种机制,是在多线程程序中用来实现"等待–>唤醒"逻辑常用的方法,用于维护一个条件(与是条件变量不同的概念),线程可以使用条件变量来等待某个条件为真,注意理解并不是等待条件变量为真。

当条件不满足时,线程将自己加入等待队列,同时释放持有的互斥锁; 当一个线程唤醒一个或多个等待线程时,此时条件不一定为真(虚假唤醒)。

1.2、个人理解:
两个线程利用条件变量及互斥锁实现同步。条件变量和互斥锁对两个线程来说是全局的
一个线程利用条件变量实现等待,同时释放锁;
一个线程获取锁后利用该条件变量唤醒等待的线程

二、用法:
2.1、std::condition_variable::wait

1void wait (unique_lock<mutex>& lck);  

对应线程让自己挂起并释放锁

2template <class Predicate> void wait (unique_lock<mutex>& lck, Predicate pred); 

若pred为false则对应线程挂起并释放锁,直到被唤醒,唤醒后再判断pred,若为false则继续挂起,直到被唤醒同时条件为true
相当于: while (!pred()) wait(lck);

3、std::condition_variable::notify_one

发送通知以唤醒等待队列中的线程。

4template <class Rep, class Period> cv_status wait_for (unique_lock<mutex>& lck, const chrono::duration<Rep,Period>& rel_time); 

等待直到被唤醒或超时,返回值为超时与否。其同样有另一种重载形式,与(2)类似。

三、总结:
1、注意区分条件变量与条件:条件变量是用于同步的机制,条件是条件变量控制函数执行或等待的判断依据
2、wait的两个重载方法,区别是等待时是否判断条件

参考资料:
1、 线程间同步方式详解
2、 CPP

你可能感兴趣的:(STL实用技巧笔记,c++)