std::shared_ptr并发访问健全性检查



我正在努力确保我正确理解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.xshared_ptr<X>成员的唯一实例,因此可以再次安全地复制到localxptr
  • SomeThread2安全的:由于d是指向Data的指针,因此d.x与调用线程具有相同的shared_ptr<X>实例,因此无法安全地复制到localxptr中,这会使新线程和调用线程(以及其他任何人(都有访问同一shared_ptr<X>实例的风险

我的评估正确吗?

看起来很明显,但我只是想检查一下,因为我最近盯着很多代码看太久了。

您链接的另一个问题似乎提供了答案:这取决于其他线程可能在做什么。

如果以非常量方式使用shared_ptr,则它不是线程安全的。但是,您只是将它传递给复制构造函数(9(,后者将它作为const引用接受。如果所有其他线程都以相同的方式访问它(没有一个线程试图修改它(,那么这是安全的。

最新更新