Tot*_*son 3 c++ stl thread-safety race-condition stdlist
我有一个使用标准列表容器的缓冲区。
工人在一侧推动元素,而另一侧从另一侧弹出。这两个线程在访问容器之前都使用互斥量。
为了查看性能,我需要查询容器的大小。但是,如果不需要的话,使用互斥量查询大小似乎有点过分。
问题是,有必要吗?
文档对调用size()进行了说明(在“数据竞争”部分下: 没有包含的元素被访问:同时访问或修改它们是安全的。
问题是,有必要吗?
是。您可能在查询元素的大小时将其添加到列表中,这是未定义的行为。
规则是,如果您有多个线程访问共享库,并且其中至少有一个写入该对象,则必须具有同步性。如果没有,那么您将发生数据争夺,这是未定义的行为。
根据您的修改:
没有包含的元素被访问:同时访问或修改它们是安全的。表示列表中的元素不会被访问或突变。这意味着您可以调用size()
而不必担心它会修改列表中的任何元素。就在它具有访问容器之前。是访问不是线程安全的。如果在调用size时将元素添加到列表中,则获得的值是不确定的。
归档时间: |
|
查看次数: |
98 次 |
最近记录: |