c++ - 原子布尔向量的线程安全
问题描述
如果我有一个向量:
std::vector<std::atomic_bool> v(8);
并假设我不会在创建后修改它的大小,调用是否是线程安全的:
bool result = v[2].compare_exchange_strong(false, true);
* 值 8、2、false 和 true 仅作为示例用例给出。
解决方案
OP似乎在询问是否可以评估多个线程
v[2].compare_exchange_strong(false, true)
当此类评估可能并发时,不会导致数据竞争。
这不会编译,因为compare_exchange_strong
需要一个左值作为它的第一个参数。我将假设这个问题已得到纠正。
答案是肯定的。根据 [container.requirements.dataraces]/1:
为了避免数据竞争(16.5.5.10 ),实现应考虑以下功能
const
:_begin
end
rbegin
rend
front
back
data
find
lower_bound
upper_bound
equal_range
at
operator[]
这意味着v[2]
不允许评估来修改向量(也不允许在线程之间共享任何内部静态数据),因此可能不会在另一个线程中与相同的评估竞争。该compare_exchange_strong
操作是在一个原子对象上执行的,所以它不可能与任何东西竞争。
推荐阅读
- vba - 如何在不覆盖 VBA 中的行的情况下将新行添加到另一个工作表?
- java - 如何在没有 setter 或公开变量的情况下将私有类实例变量设置为 unmarshaller 使用的 File 对象?
- java - 使用 DataFlow (Apache Beam) 将 ISO-8859-1 加载到 BigQuery 时出现问题
- c++ - c++中opencv puttext函数的问题
- json - Flutter:如何映射字典?通过字典制作下拉选项
- json - 使用 Moshi 处理可能是列表或自定义对象的 JSON 响应
- javascript - 点击时如何从表单中获取数据?
- amazon-web-services - api 网关与 aws 批处理集成
- visual-studio - 签入策略 Visual Studio - 如果在定义的模板中,则检查变更集注释
- java - 启动 Tomcat 时 JavaMelody 抛出 NullPointerException