【发布时间】:2017-05-20 21:54:09
【问题描述】:
std::shared_ptr<int> int_ptr;
int main() {
int_ptr = std::make_shared<int>(1);
std::thread th{[&]() {
std::weak_ptr int_ptr_weak = int_ptr;
auto int_ptr_local = int_ptr_weak.lock();
if (int_ptr_local) {
cout << "Value in the shared_ptr is " << *int_ptr_local << endl;
}
});
int_ptr.reset(nullptr);
th.join();
return 0;
}
上面的代码是线程安全的吗?我读了这个答案About thread-safety of weak_ptr,但只是想确保上面的代码是线程安全的。
我问这个的原因是,如果上面的代码确实是线程安全的,我无法理解std::weak_ptr 和std::shared_ptr 接口如何使以下操作原子expired() ? shared_ptr<T>() : shared_ptr<T>(*this)。在我看来,如果不使用某种互斥锁或自旋锁,就无法使像上面这样的两行逻辑代码同步。
我了解原子增量如何与不同的共享指针实例一起工作,并且我了解shared_ptrs 本身不是线程安全的,但如果上面确实是线程安全的,那么它非常类似于线程安全的shared_ptr,我不明白上面条件中的两行代码如何在没有锁的情况下成为原子代码。
【问题讨论】:
-
"它非常像线程安全的
shared_ptr" - 使用shared-shared_ptr来构造weak_ptr真的是线程安全的吗?跨度> -
没有什么可以阻止实现使用互斥体使
lock原子化,除非它效率不高。
标签: c++ multithreading c++11 shared-ptr weak-ptr