shared_ptr 线程安全

Then what‘s really happening is TWO different sections of memory are being allocated. It‘s done at one time,

but it‘s two "logical" blocks. One is the int which stores the actual value, and the other is the control block,

which stores all the shared_ptr "magic" that makes it work.

It is only the control block itself which is thread-safe.

shared_ptr<int> global_ptr = make_shared<int>(0);

void thread_fcn();

int main(int argc, char** argv)

{

thread thread1(thread_fcn);

thread thread2(thread_fcn);

...

thread thread10(thread_fcn);

chrono::milliseconds duration(10000);

this_thread::sleep_for(duration);

return;

}

void thread_fcn()

{

// This is thread-safe and will work fine, though it‘s useless.  Many

// short-lived pointers will be created and destroyed.

for(int i = 0; i < 10000; i++)

{

shared_ptr<int> temp = global_ptr;

}

// This is not thread-safe.  While all the threads are the same, the

// "final" value of this is almost certainly NOT going to be

// number_of_threads*10000 = 100,000.  It‘ll be something else.

for(int i = 0; i < 10000; i++)

{

*global = *global + 1;

}

}

C++标准库为std::shared_ptr提供了一些重要的辅助函数,让这些智能指针可以以“原子操作”的方式获取值,设置值.

std::shared_ptr<my_data> p;

void process_global_data()

{

std::shared_ptr<my_data> local=std::atomic_load(&p);

process_data(local);

}

void update_global_data()

{

std::shared_ptr<my_data> local(new my_data);

std::atomic_store(&p,local);

}

So if you do: it will be thread safe.

//In thread 1

shared_ptr<myClass> private = atomic_load(&global);

...

//In thread 2

atomic_store(&global, make_shared<myClass>());...

时间: 2024-10-26 20:29:49

shared_ptr 线程安全的相关文章

shared_ptr的线程安全

1.9 再论shared_ptr 的线程安全 虽然我们借shared_ptr 来实现线程安全的对象释放,但是shared_ptr 本身不是100% 线程安全的.它的引用计数本身是安全且无锁的,但对象的读写则不是,因为shared_ptr 有两个数据成员,读写操作不能原子化.根据文档11,shared_ptr 的线程安全级别和内建类型.标准库容器.std::string 一样,即: 一个shared_ptr 对象实体可被多个线程同时读取: 两个shared_ptr 对象实体可以被两个线程同时写入,

VC++常见的BUG防范及解决办法

C++语言是桌面系统,尤其是系统软件.大型应用软件的主流开发语言.C++语言以其灵活性著称,同时也更复杂.利用C++编写健壮的代码,更具有挑战性.C++允许动态内存管理,同时也容易导致更多和内存相关的问题. 为能够有效地避免开发中潜在的危险代码,应遵循C++相关的编码规范和惯用法: 1,基类或者带有虚函数的类应该将其析构函数声明为虚函数. 2,在构造函数中防止内存泄漏,在析构函数中不要抛出异常. 3,使用对应形式的new和delete.即:用delete来释放new申请的内存,delete[ ]

我所理解的cocos2dx - cocos2dx架构一憋(一)

cocos2dx引擎总览 游戏引擎是什么?最简单的游戏引擎本身就是一个渲染系统而已,它调用底层各类的api,来帮助开发者进行渲染.cocos2dx也是如此,它最主要的功能就是提供非常方便使用的渲染机制,并且是跨平台的,这对于开发者来说就十分的喜欢了. 除此以外,cocos2dx通过使用第三方库来支持许多游戏开发中需要用到的功能,例如文件解压,图片解析,网络支持,物理引擎,音频等功能,让开发者可以更专注于渲染引擎的开发.并且还封装了和平台无关的接口:文件加载,纹理解析,线程操作等. cocos2d

各科基础详实

一. Java基础部分 1. JAVA的基本数据类型有哪些 ?  String 是不是基本数据类型 ? 2. 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 3. Java有没有goto? 7 4. 说说&和&&的区别. 7 5. 在JAVA中如何跳出当前的多重嵌套循环? 7 6. switch语句能否作用在byte上,能否作用在long上,能否作用在String上? 8 7. short s1 = 1; s1 = s1 + 1;有什么

shared_ptr的线程安全性

一: All member functions (including copy constructor and copy assignment) can be called by multiple threads on different instances of shared_ptr without additional synchronization even if these instances are copies and share ownership of the same obje

C++智能指针剖析(下)boost::shared_ptr&amp;其他

1. boost::shared_ptr 前面我已经讲解了两个比较简单的智能指针,它们都有各自的优缺点.由于 boost::scoped_ptr 独享所有权,当我们真真需要复制智能指针时,需求便满足不了了,如此我们再引入一个智能指针,专门用于处理复制,参数传递的情况,这便是如下的boost::shared_ptr. boost::shared_ptr 属于 boost 库,定义在 namespace boost 中,包含头文件#include<boost/smart_ptr.hpp> 便可以使

C++11线程池的实现

什么是线程池 处理大量并发任务,一个请求一个线程来处理请求任务,大量的线程创建和销毁将过多的消耗系统资源,还增加了线程上下文切换开销. 线程池通过在系统中预先创建一定数量的线程,当任务请求到来时从线程池中分配一个预先创建的线程去处理任务,线程在处理任务之后还可以重用,不用销毁,从而节省系统资源.对于多核处理器,线程会被分配到多个CPU,提高并行处理效率.每个线程独立阻塞,防止主线程被阻塞而使主流程被阻塞 半同步半异步线程池 三层 第一层:同步服务层,处理上层任务请求 第二层:同步排队层,上层的任

智能指针的模拟实现shared_ptr 循环引用 定置删除器

auto_ptr与scoped_ptr的实现见本人的上篇博客. 三.shared_ptr shared_ptr的实现原理是通过引用计数来实现,只有当引用计数为1时才释放空间,否则只需将引用计数减1.拷贝和赋值将引用计数加1,具体代码如下: template <typename T> class SharedPtr { public: SharedPtr(); SharedPtr(T* ptr); SharedPtr(const SharedPtr<T>& ap); ~Sha

c++ 日志类 线程安全+缓存

根据上一次的测试,有缓存的日志类性能会更好.用到了time.h类函数,所以在linux下就要改动一下了,windows环境下写的. 思路采用(参照muduo库的日志,不过认为他线程不安全,和没用缓存,就改造了下) 1.有一个总的缓存,logboss,为一个恶汉模式的单例类,指针对象为智能指针,析构函数讲缓存写入文件. 2.有一个logger类,作为临时缓存,析构函数,将里面的缓存写入总缓存(在总缓存写入的时候加锁).如果缓存超过一定限度,就将前面的缓存写入文件先. void LogBoss::a