复制shared_ptr线程安全问题

hittyo 2011-05-20 11:16:35


shared_ptr文档中有这么一段:

shared_ptr objects offer the same level of thread safety as built-in types. A shared_ptr instance can be
"read " (accessed using only const operations) simultaneously by multiple threads. Different shared_ptr instances can be
"written to " (accessed using mutable operations such as operator= or reset) simultaneosly by multiple threads (even when these instances are copies, and share the same reference count underneath.)
Any other simultaneous accesses result in undefined behavior.

这意味着复制使用没有问题,但我后来又发现如下问题:

shared_ptr在传参以及operator=操作时会对记数器进行增加,但是记数器本身不是线程安全,这就非常费解了。

难道在shared_ptr当参数传递时必须要用到weak_ptr来引用?
...全文
312 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengge8ylf 2011-10-02
  • 打赏
  • 举报
回复
越看越糊涂了 到底是不是线程安全的
hittyo 2011-05-20
  • 打赏
  • 举报
回复
再次看了一下,“当析构函数遇到多线程”

陈硕的一句话:它的引用计数本身是安全且无锁的

也就是说多线程中的复制与传参过程中的计数增加也应该是安全的,不存在同时在操作引用计数。

多线程中真是隐患重重啊,怎么死的都不知道。
国风 2011-05-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 namelij 的回复:]
shar_ptr不是线程安全的,具体去看看源码你就知道了
[/Quote]
++
  • 打赏
  • 举报
回复
shar_ptr不是线程安全的,具体去看看源码你就知道了
hittyo 2011-05-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dizuo 的回复:]

你怎么知道计数器不是线程安全的。。
计数器肯定是临界资源,
[/Quote]

我引用一篇有疑义的文章:http://www.rosoo.net/a/201012/10555.html
“由于多线程同是访问智能指针,并将其赋值到其它同类智能指针时,很可能发生两个线程同时在操作引用计数(但并不一定绝对发生),而导致计数失败或无效等情况,从而导致程序崩溃”

那么能不能请这位高人给个明确的说法,这个计数是不是线程安全的?
hittyo 2011-05-20
  • 打赏
  • 举报
回复
举个复杂的例子

void dosth(shared_ptr<test1> test1_ptr)
{
//test1_ptr->val;
}

class test1 : public enable_shared_from_this<Handler>
{
int val;
void fun()
{
dosth(shared_from_this()); //****注意这里
}
}


main()
{
shared_ptr<test1> test1_ptr(new test1);
boost::thread t1(bind(&test1::fun,test1_ptr));
boost::thread t2(bind(&test1::fun,test1_ptr));
t1.join();
t2.join();
}


不知以上例子是否存在线程安全问题。
fish_phenix 2011-05-20
  • 打赏
  • 举报
回复
shared_ptr 需要做成线程安全的么

你在多线程使用shared_ptr 你自己要保证线程安全啊。。。


downmooner 2011-05-20
  • 打赏
  • 举报
回复
他的一些变量是volatile类型,还有interlock 操作。应该是安全的

没注意这么深
ryfdizuo 2011-05-20
  • 打赏
  • 举报
回复
你怎么知道计数器不是线程安全的。。
计数器肯定是临界资源,
hittyo 2011-05-20
  • 打赏
  • 举报
回复
换句话说,有时读shared_ptr也是写操作,这样子意义就和普通类型有偏差了
hittyo 2011-05-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yfkiss 的回复:]

shared_ptr的文档对其描述的很清晰了,其线程安全级别和内置类型(eg:int、float)一样。
简单的说,就是多线程多读安全,其余(读写、写写)不保证线程安全。
[/Quote]

不是说这个问题,问题在于shared_ptr其内部有计数,拷贝会有写改变计算的操作.
从这方面来说int、float是没有的,所有它们不存在问题。
yfk 2011-05-20
  • 打赏
  • 举报
回复
shared_ptr的文档对其描述的很清晰了,其线程安全级别和内置类型(eg:int、float)一样。
简单的说,就是多线程多读安全,其余(读写、写写)不保证线程安全。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧