gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:54:36 24 4
gpt4 key购买 nike

在试图解决 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com