Muduo学习历程,线程同步

文章介绍了线程同步的四个基本原则,包括减少对象暴露、使用高级并发组件、优先选择非递归互斥器和条件变量,以及lock-free与atomic的使用。同时,详细阐述了互斥器和条件变量的正确使用方式,以及线程安全的单例模式实现和CopyOnWrite策略的应用。
摘要由CSDN通过智能技术生成

线程同步四原则

        1.减少对象暴露给别的线程

        2.使用高级的并发编程组件

        3.必须使用同步原语时,只用非递归的互斥器和条件变量,不用读写锁和信号量

        4.lock-free仅限于atomic

互斥器

        用RAII手法包装互斥器,只用非递归的mutex,不手工调用lock和unlock

条件变量

        条件变量只有如下这一种推荐的使用方法,几乎不出错

LockGraund lk(m_mux);
while(m_taskQueue.empty() && m_running){
        m_condEmpty.wait(lk);    
}

        在等待端:为什么只能用while而不能用if,原因:一个消费者线程阻塞,另一个消费者线程正在运行,而且刚通过检查,此时A被唤醒,两个线程同时消费一个数据,产生错误(spurious wakeup)

        在唤醒端:修改bool表达式需要用mutex保护,区分notify_one和notify_all(前者用于表示资源可用,后者用于表示状态发生变化)

        互斥器和条件变量组成了多线程编程的全部原语,用这两个手段可以完成所有的多线程编程

线程安全单列实现

template< typename T>
class Singleton{
public:
    T &getInstance(){
        std::call_once(once,&Singleton::initSingleton);
        return *t;
    }

    T *getInstance(){
        std::call_once(once,&Singleton::initSingleton);
        return t;
    }

    static void initSingleton(){
        t = new T();
    }    

private:
    static std::once_flag once;
    static T* t;
};


template<typename T>
std::once_flag Singleton<T>::once;
template<typename T>
T *Singleton<T>::t = NULL;

利用shared_ptr实现copy on write

class SharedPtrCopyOnWrite{
public:
    SharedPtrCopyOnWrite(){
        someDataTobeShared = std::make_shared<vector<int>> (2,3);
    }

    void reader(){
        std::shared_ptr<vector<int>> localPtr;
        {
            LockGraund lk(m_mux);
            localPtr = someDataTobeShared;
        }
        ///some read op
        for(auto i:*localPtr){

        }
    }

    void write(){
        LockGraund lk(m_mux);
        if(!someDataTobeShared.unique()){
            std::shared_ptr<vector<int>> newData(new vector<int>(*someDataTobeShared));
            someDataTobeShared.swap(newData);
        }
        assert(someDataTobeShared.unique());
        ///some write op
        (*someDataTobeShared)[0] = 3;
    }
private:
    std::shared_ptr<vector<int>> someDataTobeShared;
    std::mutex m_mux;
};

       

        

        

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值