std::shared_ptr 并发访问完整性检查
std::shared_ptr concurrent access sanity check
我正在努力确保我正确理解 ,其中:
- 对底层共享引用计数器的修改(
std::_Sp_counted_base
在 GCC 附带的 stdc++ 实现中)是线程安全的。
- 对
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>
实例的风险。
我的评估正确吗?
看起来很明显,但我只是想进行完整性检查,因为最近我盯着大量代码看的时间太长了。
您链接的另一个问题似乎提供了答案:这取决于其他线程可能在做什么。
A shared_ptr
不是线程安全的如果它以非常量方式使用。但是,您只是将它传递给 the copy constructor (9),它接受它作为 const 引用。如果所有其他线程都以相同的方式访问它(none 其中的线程试图修改它),这是安全的。
我正在努力确保我正确理解
- 对底层共享引用计数器的修改(
std::_Sp_counted_base
在 GCC 附带的 stdc++ 实现中)是线程安全的。 - 对
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>
实例的风险。
我的评估正确吗?
看起来很明显,但我只是想进行完整性检查,因为最近我盯着大量代码看的时间太长了。
您链接的另一个问题似乎提供了答案:这取决于其他线程可能在做什么。
A shared_ptr
不是线程安全的如果它以非常量方式使用。但是,您只是将它传递给 the copy constructor (9),它接受它作为 const 引用。如果所有其他线程都以相同的方式访问它(none 其中的线程试图修改它),这是安全的。