深入应用C++11 笔记(八)
—条件变量 +原子变量+call_once/once_flag
条件变量
条件变量是C++11 提供的另外一种用于等待的同步机制,它能阻塞一个或多个线程,直到收到另外一个线程发出的通知或者超时,才会唤醒当前阻塞的线程。条件变量需要和互斥量配合起来用。
- condition_variable,配合std::unique_lock < std::mutex>进行wait操作。
- condition_variable_any,和任意带有lock、unlock语义的mutex搭配使用,比较灵活,但效率比condition_variable差一些。
condition_variable_any比condition_variable更灵活,因为它更通用,对所有锁都适用,而condition_variable性能更好。
条件变量使用过程如下:
- 拥有条件变量的线程获取互斥量
- 循环检查某个条件,如果条件不满足,则阻塞直到条件满足;如果条件满足,则向下执行。
- 某个线程满足条件执行完之后调用notify_one或notify_all唤醒一个或者多有的等待线程。
可以用条件变量来实现一个同步队列,同步队列作为一个线程安全的数据共享区,经常用于线程之间数据读取,比如半同步半异步线程池的同步队列:
#include <mutex>
#include <thread>
#include <condition_variable>
template<typename T>
class SyncQueue
{
private:
bool IsFull() const //const函数不能修改其数据成员
{
return m_queue.size()==m_maxSize;
}
bool IsEmpty() const
{
return m_queue.empty();
}
public:
SyncQueue(int maxSize):m_maxSize(maxSize){}
void