And*_*owl 26 c++ shared-ptr language-lawyer c++11 c++14
在尝试围绕这个问题中显示的问题时,我发现自己陷入了[util.smartptr.shared]/4中的以下句子:
[...]更改
use_count()
不反映可能引入数据争用的修改.
我不明白我应该怎么读,以及我应该得出什么结论.以下是一些解释:
use_count()
不会引入数据争用(但这应该由该const
函数的-ness单独保证,以及相应的库范围保证)use_count()
不受("不反映"?)影响需要原子性或同步的操作的结果(但这些相关操作是什么?)use_count()
以原子方式执行,但不会阻止CPU或编译器重新排序(即没有顺序一致性,但为什么不提及特定模型?)对我来说,上述任何一个似乎都没有从那句话中得出,而我却在试图解释它.
eca*_*mur 11
当前的措辞来自库问题896,该问题还解决了是否shared_ptr
应该是线程安全的问题,即可以shared_ptr
同时从不同的线程访问(特别是复制和销毁)拥有相同对象的不同s.该讨论的结论是shared_ptr
应该是线程安全的; 保证这一点的机制是假装shared_ptr
成员函数只访问shared_ptr
对象本身而不是它的堆上控制块:
用于确定数据种族的存在的目的,成员函数访问和修改仅
shared_ptr
和weak_ptr
物体本身而不是它们引用的对象.
这里"它们引用的对象"表示控制块.
然而,这提出了一个问题; 如果我们假装shared_ptr
拥有相同对象的不同s不访问控制块,那么肯定use_count()
无法改变?这是通过制作use_count()
一个凭空产生结果的神奇功能来修补的:
更改
use_count()
不反映可能引入数据争用的修改.
也就是说,use_count()
可以从一个调用更改为下一个调用,但这并不意味着发生了数据竞争(或潜在的数据竞争).这可能比该句子以前的措辞更清楚:
[ 注:这是真实的,尽管这一事实,这种功能往往修改use_count()达-注完 ]
归档时间: |
|
查看次数: |
1006 次 |
最近记录: |