【发布时间】:2015-03-22 17:17:10
【问题描述】:
在尝试解决this question 中显示的问题时,我发现自己陷入了 [util.smartptr.shared]/4 中的以下句子:
[...]
use_count()的更改不反映可能引入数据竞争的修改。
我不明白我应该怎么读,我会得出什么结论。 以下是一些解释:
- 调用
use_count()不会引入数据竞争(但这应该由该函数的const-ness 以及相应的库范围保证来保证) -
use_count()返回的值不受(“不反映”?)需要原子性或同步的操作结果的影响(但这些相关操作是什么?) -
use_count()以原子方式执行,但不会阻止 CPU 或编译器重新排序(即没有顺序一致性,但为什么不提及特定模型?)
对我来说,上面的内容似乎都不是从那句话中得出的,我在试图解释它时不知所措。
【问题讨论】:
-
通过“调用
use_count()”你是否让多个线程同时调用它,但没有以任何其他方式使用那个shared_ptr对象? -
@BenVoigt:是的(我猜),尽管“解释”只是从那句话中提取有意义的东西的绝望尝试。我什至不知道那个“东西”是什么。
-
here 的这句话是否为您澄清了这一点:
Requiring shared_ptr and weak_ptr to always synchronize the use count makes it potentially slow and is inconsistent with the general approach to leave the synchronization to the user of a facility. -
我认为它使用
use_count()来指代实际使用计数。即,假设两个shared_ptrsa和b共享同一对象的所有权;如果线程 1 从a创建一个新的shared_ptr,同时线程 2 重置b,这不会导致数据竞争,即使这两个操作都会更改使用计数。 -
@ShafikYaghmour:它确实提供了进一步的解释(谢谢),但我仍然不明白这意味着什么或在实践中意味着什么。
标签: c++ c++11 shared-ptr language-lawyer c++14