C++ : shared_ptr是线程安全的吗?

作者&投稿:衷苛 (若有异议请与网页底部的电邮联系)
~ 在C++面试中,关于shared_ptr是否线程安全的问题常常被提起。针对这一问题,需要从三个并发操作角度分析:拷贝shared_ptr、赋值操作以及对内存区域的读写。

首先,当对shared_ptr进行拷贝时,由于引用计数的更新是原子操作,保证了线程安全。例如,当两个线程同时复制同一个shared_ptr时,引用计数始终维持在20001,没有出现并发问题。

然而,当两个线程同时修改shared_ptr指向的内存区域时,情况就不同了。这种操作并不保证线程安全,如示例中,预期的20000自增结果并未得到,导致了线程不一致。

此外,直接修改shared_ptr对象的指向同样存在线程不安全问题。在程序中,两个线程同时改变shared_ptr的指向,会导致程序异常终止,错误发生在析构过程中,可能由于并发操作对析构中的对象进行了不恰当的操作。

解决此类问题的方法是确保对这些敏感操作进行适当的同步,如使用锁。通过这种方式,程序可以在并发环境中正常运行。

对于希望深入学习C++的读者,这里有相关的学习资源:百度链接 | 谷歌链接。


保康县15017571358: C++几种智能指针之间的比较 -
邹饺普罗: auto_ptr、unique_ptr、shared_ptr、weak_ptr.其中auto_ptr在C++98标准引入,后三种在C++11标准中加入.而auto_ptr已经被C++11所摒弃,建议使用后三种智能指针,这4种智能指针使用模板(template)实现.

保康县15017571358: 请教C++语句:shared - ptr<T>static - pointer - cast(const shared - ptr<U>&r) -
邹饺普罗: 很简单,这是一个函数.shared_ptr是返回值 函数名称:static_pointer_cast; 参数const shared_ptr&r' 就这么简单.补充:那不叫取址..那叫引用.你难道这点c++基础都没有?那你还敢看Boost源码?

保康县15017571358: C++智能指针的几种用法 -
邹饺普罗: 一、auto_ptr模板auto_ptr与shared_ptr、unique_ptr都定义了类似指针的对象,可以将new到的地址赋给这一对象,当智能指针过期时,析构函数会调用delete函数,对象将被销毁,由此内存可以自动被释放.二、shared_ptr模板先看代码:...

保康县15017571358: c++中关于智能指针std::tr1::shared - ptr的用法 -
邹饺普罗: 智能指针本身绝对不能是动态分配的内存,不然只能指针就没有存在的意义了.智能指针有个数据成员,是个指针,至于什么类型,看你类模板怎么实现.这个指针才是动态分配内存的.只能本身必须是栈里分配内存.利用栈的自动回收数据的...

保康县15017571358: 如何理解智能指针 -
邹饺普罗: 1、什么是智能指针?先看看一个最简单的例子 auto_ptr:template <class T> class auto_ptr{T* ptr;public:explicit auto_ptr(T* p = 0) : ptr(p) {}~auto_ptr() {delete ptr;}T& operator*() {return *ptr;}T* operator->() {return ptr;}// ...};首先它拥有...

保康县15017571358: 如何评价 C++11 的右值引用特性
邹饺普罗: 右值引用是C++11中最重要的新特性之一,它解决了C++中大量的历史遗留问题,使C++标准库的实现在多种场景下消除了不必要的额外开销(如std::vector, std::string),也使得另外一些标准库(如std::unique_ptr, std::function)成为可能.即使...

保康县15017571358: new和delete -
邹饺普罗: 现代的C++风格:如果必须要动态分配内存构造对象,单个对象用make_unique,对应的数据类型是unique_ptr,如果情况不允许用 unique_ptr,就用 make_shared / shared_ptr;数组用 std::vector 类型.以上可以自动处理各种情况,不要用 new/delete 如果这规定还不够简单,以下是无脑的规则:始终使用 auto p = boost::make_shared(传给构造函数的参数) 把 p 当作普通的指针来用.——对于只接受普通指针的函数,传递 p.get()

保康县15017571358: c++标准库的C++标准库 -
邹饺普罗: C++标准库的内容基本可以分以下为10类 (未注明为c++98 03的标准库). 头文件 描 述 <utility> 定义重载的关系运算符,简化关系运算符的写入,它还定义了pair类型,该类型是一种模板类型,可以存储一对值.这些功能在库的其他地方使用 ...

保康县15017571358: C++ 定位new 的问题 -
邹饺普罗: 1. placement new不需要调用delete,不过需要手动调用对象的析构函数2. 确实是程序员自主管理,placement new实际的行为只是调用构造函数而已3. 显然不能 placement new是给有特殊要求的底层实现准备的,实际写高级应用的时候没必要用到显式的new和delete.标准库有shared_ptr类可以自动管理动态内存、make_shared函数在动态内存上构造对象(返回对应的shared_ptr),一般使用shared_ptr就足够了

保康县15017571358: 关于c++智能指针shared - ptr的一些疑惑 -
邹饺普罗: 不要用自己的方式瞎摸索, 你这都是违规行为,多看看书.第一种方式资源会自动销毁. 第二中方式, p = t 没法通过编译的.给你几条建议: 不要这么喜欢malloc, 使用new/delete shared_ptr<>是基于RAII思想( resource aquisition is initialization ), 所以你要这样 share_ptr<int> sp( new int ) 这种方式去初始化智能指针. 使用sp->这样方式去引用资源, 而不是raw ptr = sp.get(),

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网