【发布时间】:2020-01-21 21:30:09
【问题描述】:
我有一个使用标准列表容器的缓冲区。
一个工人正在推动一侧的元素,另一个线程正在从另一侧弹出。这两个线程在访问容器之前都使用了互斥锁。
作为查看性能的一种方式,我需要查询容器的大小。但是,如果没有必要,使用互斥锁查询大小似乎有点过头了。
问题是,有必要吗?
在调用 size() 时文档说(在数据竞赛部分下: 不访问包含的元素:同时访问或修改它们是安全的。
【问题讨论】:
-
除非明确指定为线程安全,否则将所有内容视为非线程安全。
-
例如,
vector通常根据减去两个指针来计算大小。a-b中有很多空间可以中断,如果在中途调整大小时指针被换掉,那真的很糟糕。 -
不管怎样,你仍然会有竞争条件。检查后尺寸可能会发生变化。 (无论如何你不能那样做。)
-
“任何一种”方式是什么?好吧,尺寸应该在检查后改变。这就是为什么我需要继续检查..!
-
我在下面的回答中强调,您需要在这里关注的数据是列表 container,因为这是需要通过相互包含来保护的。您的编辑指的是 包含的元素,正如我在下面的 cmets 中解释的那样,它是一种不同的数据。
标签: c++ stl thread-safety race-condition stdlist