我知道我迟到了,但是在搜索"weak_ptr线程"时会出现这种情况,而Casey的回答并不是全部真相.二者shared_ptr
并weak_ptr
可以从线程使用而无需进一步的同步.
因为shared_ptr
,有很多文档(例如在cppreference.com或stackoverflow上).您可以安全地shared_ptr
从不同的线程访问该对象.你无法从两个线程敲击相同的指针.换一种说法:
// Using p and p_copy from two threads is fine. // Using p from two threads or p and p_ref from two threads is illegal. std::shared_ptr p = std::make_shared(); std::shared_ptr &p_ref = p; std::shared_ptr p_copy = p;
要在代码中解决该问题,请将g_s
参数(按值)传递给*f1()
.
对于弱指针,安全保证隐藏在weak_ptr :: lock的文档中:
有效地返回
expired() ? shared_ptr
,以原子方式执行.() : shared_ptr (*this)
您可以使用从其他线程weak_ptr::lock()
获取a shared_ptr
而无需进一步同步.这也证实了这里的升压和这个苏答案克里斯小丑,年轻.
同样,你必须确保不修改相同weak_ptr
,而从另一个访问它从一个线程,所以传球g_w
到f3()
由价值为好.