【发布时间】:2010-10-01 07:20:59
【问题描述】:
有人知道完全线程安全的shared_ptr 实现吗?例如。 shared_ptr 的 boost 实现对于目标(引用计数)是线程安全的,并且对于同时读取 shared_ptr 实例也是安全的,但对于写入或读/写则不是。
(参见Boost docs,示例 3、4 和 5)。
对于shared_ptr 实例,是否存在完全线程安全的shared_ptr 实现?
奇怪的是 boost 文档这么说:
shared_ptr 对象提供与内置类型相同级别的线程安全性。
但是,如果将普通指针(内置类型)与smart_ptr 进行比较,则普通指针的同时写入是线程安全的,但同时写入smart_ptr 则不是。
编辑:我的意思是 x86 架构上的无锁实现。
EDIT2:这种智能指针的一个示例用例是,有许多工作线程使用它们当前的工作项更新全局 shared_ptr 和一个对工作项进行随机采样的监控线程。 shared-ptr 将拥有该工作项,直到另一个工作项指针被分配给它(从而破坏先前的工作项)。监视器将通过将工作项分配给它自己的 shared-ptr 来获得工作项的所有权(从而防止工作项被销毁)。可以通过 XCHG 和手动删除来完成,但如果 shared-ptr 可以做到这一点会很好。
另一个例子是全局 shared-ptr 拥有一个“处理器”,由某个线程分配,并由某个其他线程使用。当“用户”线程看到处理器 shard-ptr 为 NULL 时,它使用一些替代逻辑来进行处理。如果它不是 NULL,它会通过将处理器分配给它自己的 shared-ptr 来防止处理器被破坏。
【问题讨论】:
-
"同时写入一个普通指针是线程安全的" -- 你确定吗?
-
至少在x86上,如果指针对齐正确,写操作是原子的。
-
在一个线程中同时写入并在另一个线程中删除呢? (delete 本质上是一种特殊的写入方式;删除所指向的项目)。
-
Max:您所描述的是同时读取和写入。 delete 不会改变指针变量本身的值,因此它不算作写入——它是(可能)被写入的 pointed-to 值(如果说是由析构函数写入的)存在)。
-
"写操作是原子的" 这并不是常识中的“线程安全”。
标签: c++ boost thread-safety shared-ptr