gpt4 book ai didi

c++ - 在 std 容器线程上调用 size() 是否安全?

转载 作者:太空狗 更新时间:2023-10-29 20:19:35 28 4
gpt4 key购买 nike

我有一个使用标准列表容器的缓冲区。

一个 worker 在一侧插入元素,另一个线程从另一侧弹出。这两个线程在访问容器之前都使用互斥体。

作为查看性能的一种方式,我需要查询容器的大小。但是,如果没有必要,使用互斥锁查询大小似乎有点矫枉过正。

问题是,有必要吗?

文档说调用 size() (在数据竞赛部分下:没有访问包含的元素:并发访问或修改它们是安全的。

最佳答案

Question is, is it necessary?

是的。您可以在查询元素大小时将元素添加到列表中,这是未定义的行为。

规则是如果你有多个线程访问一个共享对象,并且其中至少有一个线程写入所述对象,你必须有同步。如果不这样做,就会发生数据竞争,这是未定义的行为。


根据您的修改:

未访问包含的元素:并发访问或修改它们是安全的。 表示列表的元素未被访问或更改。这意味着您可以调用 size() 而不必担心它会修改列表中的任何元素。就在那之前,它有访问容器。正是这种访问不是线程安全的。如果您在调用 size 时向列表中添加元素,则您获得的值是未定义的。

关于c++ - 在 std 容器线程上调用 size() 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58034863/

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