- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
在试图解决 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
andweak_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++ 中使用 std::shared_ptr。但这很令人困惑,我不明白如何创建指向同一对象的多个共享指针。甚至文档和在线资料也不是很清楚。 以下是我编写的一小段代码,用于尝试理
我定义并分配了 2 个 shared_ptr nullptr。在情况 1 中,我使用默认构造函数,在情况 2 中,我使用带有 delete 方法的构造函数。 shared_ptr sptr2(null
在下面的代码片段中: shared_ptr p; { p = shared_ptr(new int); cout<
我的申请问题如下- 我有一个大结构 foo。因为它们很大并且出于内存管理的原因,我们不希望在数据处理完成后删除它们。 我们将它们存储在 std::vector>. 中 我的问题与了解所有处理何时完成有
我想出了下面的例子 std::shared_ptr a(new foo()); { std::shared_ptr b = a; std::cout a(new foo());
有人可以帮我解决为什么输出是 2 而不是 3 吗?谢谢。 int main() { std::shared_ptr x(new int); std::shared_ptr const&
我找不到与此类似的问题,如果我错过了,请指导我! 我正在试验智能指针,并来到这个场景,我想保留 use_count() 返回的值在 shared_ptr 对象中设置为 1(练习优化代码)。这是我正在使
我有一个嵌套的 boost::shared_ptr,当它被分配给另一个并超出范围时,它偶尔会被破坏。我发现 use_count 没有更新,除非我将指针复制到临时文件。代码是不言自明的。在第一个 for
我正在实现一个线程安全的“惰性同步”集合,作为由 shared_ptr 连接的节点的链表。该算法来自“多处理器编程的艺术”。我正在添加一个 is_empty() 函数,它需要与现有函数线性化:cont
我有两个 shared_ptr 指向相同的 int,即对它们调用 get() 返回相同的地址。但是对它们调用 use_count() 会返回 1。当它们中的最后一个超出范围时,它会尝试释放已经被另一个
以下代码: #include #include #include struct Foo{ Foo(): m_p(std::make_shared()) {}
我很好奇 shared_ptr 在 lambda 中被值捕获时的生命周期。 我原以为只要 lambda 仍在内存中,它的 use_count() 就始终 >= 1,但我的测试显示出一些意外情况:使用计
来自cppref : Notes An empty shared_ptr (where use_count() == 0) may store anon-null pointer accessible
我一直假设 std::shared_ptr 上的 std::move() 窃取指针并将原始指针设置为 nullptr - 因此不会增加引用计数。在我的世界里这似乎不是真的。 设置: MacOS,g++
我正在阅读 boost::shared_ptr 源代码,发现它使用这个函数来增加 shared_ptr 的使用计数(引用计数): inline void atomic_increment( int *
shared_ptr 观察者 20.8.2.2.5 C++14 最终草案 (n4296) long use_count() const noexcept; Returns: the number
我有一个使用 boost::shared_ptr 的程序s,特别是依赖于 use_count 的准确性执行优化。 例如,假设一个加法运算有两个参数指针 lhs 和 rhs。假设他们都有类型 share
在下面的代码中,我希望 shared_ptr 的 use_count() 移入 std::async 成为 1: #include #include #include using namespa
我是一名优秀的程序员,十分优秀!