在标准容器线程上调用size()安全吗?

Tot*_*son 3 c++ stl thread-safety race-condition stdlist

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

工人在一侧推动元素,而另一侧从另一侧弹出。这两个线程在访问容器之前都使用互斥量。

为了查看性能,我需要查询容器的大小。但是,如果不需要的话,使用互斥量查询大小似乎有点过分。

问题是,有必要吗?

文档对调用size()进行了说明(在“数据竞争”部分下: 没有包含的元素被访问:同时访问或修改它们是安全的。

Nat*_*ica 6

问题是,有必要吗?

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

规则是,如果您有多个线程访问共享库,并且其中至少有一个写入该对象,则必须具有同步性。如果没有,那么您将发生数据争夺,这是未定义的行为。


根据您的修改:

没有包含的元素被访问:同时访问或修改它们是安全的。表示列表中的元素不会被访问或突变。这意味着您可以调用size()而不必担心它会修改列表中的任何元素。就在它具有访问容器之前。是访问不是线程安全的。如果在调用size时将元素添加到列表中,则获得的值是不确定的。