c++ - 这篇关于shared_ptr的use_count()的Standardese是什么意思?

标签 c++ c++11 shared-ptr language-lawyer c++14

在试图解决 this question 中显示的问题时我发现自己陷入了 [util.smartptr.shared]/4 中的以下句子:

[...] Changes in use_count() do not reflect modifications that can introduce data races.

我不明白我应该怎么读,我会得出什么结论。 以下是一些解释:

  • 调用 use_count() 不会引入数据竞争(但这应该由该函数的 const-ness 以及相应的库范围保证来保证)
  • use_count() 返回的值不受(“不反射(reflect)”?)需要原子性或同步的操作结果的影响(但这些相关操作是什么?)
  • use_count() 以原子方式执行,但不会阻止 CPU 或编译器重新排序(即没有顺序一致性,但为什么不提及特定模型?)

对我来说,上面的内容似乎都不是从那句话中得出的,我在试图解释它时不知所措。

最佳答案

当前措辞来自图书馆 issue 896 ,它还解决了 shared_ptr 是否应该是线程安全的问题,因为可以从不同的线程同时进行。该讨论的结论是 shared_ptr 应该是线程安全的;保证这一点的机制是假装 shared_ptr 成员函数只访问 shared_ptr 对象本身,而不是它的堆上控制 block :

For purposes of determining the presence of a data race, member functions access and modify only the shared_ptr and weak_ptr objects themselves and not objects they refer to.

这里“他们所指的对象”是指控制 block 。

然而,这引发了一个问题;如果我们假设拥有相同对象的不同 shared_ptr 不访问控制 block ,那么 use_count() 肯定不能改变吗?通过使 use_count() 成为一个可以凭空产生结果的魔术函数来解决这个问题:

Changes in use_count() do not reflect modifications that can introduce data races.

也就是说,use_count() 可以从一个调用更改为下一个调用,但这并不意味着发生了数据争用(或潜在的数据争用)。从这句话的前面的措辞来看,这可能更清楚:

[Note: This is true in spite of that fact that such functions often modify use_count() --end note]

关于c++ - 这篇关于shared_ptr的use_count()的Standardese是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28113769/

相关文章:

c++ - 编译 DirectX9 时出错,程序提示找不到 d3dx.lib

c++ - 透视投影中的 3D 场景平移 (OpenGL)

c++ - 如何在 Autoconf 中使用 C++11 功能?

基于 C++ shared_ptr 的单例是什么导致链接错误?

c++ - 如何在 Mac OS X 上用 C++ 扫描 Wifi 接入点

c++ - 我应该让我的局部变量是常量还是可 move ?

c++ - std::thread 中的参数。如何运作?

c++ - 固定动态大小的容器

c++ - 围绕 shared_ptr 构建对象系统

c++ - C++ 中指针的困难/链接错误