深入应用C++11 笔记---条件变量 (八)

本文介绍了C++11中的条件变量和原子变量,条件变量提供了一种同步机制,常与互斥锁结合使用,用于线程间的等待与通知。文章讲解了condition_variable和condition_variable_any的用法,强调了在使用时应避免虚假唤醒,通常配合while循环检查条件。原子变量std::atomic允许在多线程环境下无锁地修改变量,简化了同步操作。此外,文章还介绍了std::call_once和once_flag,用于确保在多线程环境中函数只被调用一次,以实现线程安全的单例初始化。
摘要由CSDN通过智能技术生成

深入应用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性能更好。

条件变量使用过程如下:

  1. 拥有条件变量的线程获取互斥量
  2. 循环检查某个条件,如果条件不满足,则阻塞直到条件满足;如果条件满足,则向下执行。
  3. 某个线程满足条件执行完之后调用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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值