您链接的另一个问题似乎提供了答案:这取决于其他线程可能在做什么。
我正在努力确保我正确理解std::shared_ptr
的语义,其中:
- 对底层共享引用计数器(GCC附带的stdc++实现中的
std::_Sp_counted_base
(的修改是线程安全的 - 访问
std::shared_ptr
的给定实例不是线程安全的
考虑到这一点,请考虑以下片段:
struct Data {
std::shared_pointer<X> x;
std::shared_pointer<Y> y;
};
void SomeThread1 (Data d) {
std::shared_pointer<X> localxptr = d.x;
...
}
void SomeThread2 (std::shared_ptr<Data> d) {
std::shared_pointer<X> localxptr = d.x;
...
}
假设SomeThread[12]
是它们自己的线程,并且无论是谁创建了它们都传递了适当的参数,那么我相信是正确的吗
SomeThread1
是安全的:由于d
是复制的Data
,因此d.x
是shared_ptr<X>
成员的唯一实例,因此可以再次安全地复制到localxptr
中SomeThread2
是不安全的:由于d
是指向Data
的指针,因此d.x
与调用线程具有相同的shared_ptr<X>
实例,因此无法安全地复制到localxptr
中,这会使新线程和调用线程(以及其他任何人(都有访问同一shared_ptr<X>
实例的风险
我的评估正确吗?
看起来很明显,但我只是想检查一下,因为我最近盯着很多代码看太久了。
如果以非常量方式使用shared_ptr
,则它不是线程安全的。但是,您只是将它传递给复制构造函数(9(,后者将它作为const引用接受。如果所有其他线程都以相同的方式访问它(没有一个线程试图修改它(,那么这是安全的。