前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >std::shared_ptr智能指针的多线程版本

std::shared_ptr智能指针的多线程版本

原创
作者头像
mariolu
发布2021-02-13 14:49:10
1.7K0
发布2021-02-13 14:49:10
举报
文章被收录于专栏:CDN及云技术分享

std中关于shared_ptr智能指针的应用,常用在网络连接管理 数据库连接、共享变量,用于自动内存资源管理(RAII机制)

但是shared_ptr其实不是线程安全的,是因为ref指针跟cnt计数是两个部分,所以这里没有锁,是非线程安全的,那么在生产环境代码怎么实现一个线程安全的 智能指针的。

一、初版(传入一个类):

代码语言:javascript
复制
template <typename T>
typeclass DataManager {
    public:
        DataManager() : data_(new T) {};
        
    private:
        std::shared_ptr<T> data_; 
}

二、新增获取函数和修改函数

代码语言:javascript
复制
template <typename T>
typeclass DataManager {
    public:
        DataManager() : data_(new T) {};
        
        std::shared_ptr<const T> get() const { //const修饰函数,const修饰变量
            return data_;
        }
        
        void modify(const T& new_obj) { //替换data_
            std::shared_ptr<ptr> tmp = std::make_shared<T> (new_obj);
            data_ = tmp;
        }
    
    private:
        std::shared_ptr<T> data_; 
}

三、多线程加锁版本

代码语言:javascript
复制
template <typename T>
typeclass DataManager {
    public:
        DataManager() : data_(new T) {};
        
        std::shared_ptr<const T> get() const {
            std::lock_guard<decltype(lock_)> lock(lock_);
            return data_;
        }
        
        void modify(const T& new_obj) {
            std::shared_ptr<ptr> tmp = std::make_shared<T> (new_obj);
            std::lock_guard<decltype(lock_)> lock(lock_);
            data_ = tmp;
        }
    
    private:
        mutable std::mutex lock_; //加mutalbe保证多线程不会cache住
        std::shared_ptr<T> data_; 
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、初版(传入一个类):
  • 二、新增获取函数和修改函数
  • 三、多线程加锁版本
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档