是否可以安全地(读取)从BITSET(C )进行一些访问,该咬合可能会通过其他线程修改

Is it safe to access (read) a bit from a bitset (C++) which may be modified by a different thread

本文关键字:线程 其他 访问 修改 读取 安全 BITSET 是否      更新时间:2023-10-16

这种类型的操作是否被认为是安全的?(换句话说,如果在另一个线程上修改了斑点,则没有机会阅读某些虚假的中间值)?具体来说,我只对阅读是否安全感兴趣,换句话说,我不是在问是否可以安全地写入两个单独线程的bitset。

eg:线程1是否可靠地获得位5的当前状态,无论是否同时设置/清除BS中的其他位?

std::bitset<64> bs;
//thread 1:
bool val;
val=bs.test(5);
// ...
//thread 2:
// set/clear a few bits
bs.set(1);
bs.set(3);
bs.set(5);
bs.reset(6);
// ...

使用 std::bitset这样的方式是不是线程安全。

这是标准所说的有关访问bitset的说法(§20.9.2.2-51):

目的是确定数据竞赛的存在,通过结果参考的任何访问或更新分别访问或修改整个基础bitset。

因此,在另一个执行线程中读取它时,写入bitset对象是数据竞赛(触发未定义的行为)。即使所有线程都使用不同的索引访问BITSET对象。

bitset不提供原子修改,因此位的变化可能会在附近的位锁定较旧的值。

如果有一个重置(5)可能意味着线程1永远不会看到集合位。

没有stl容器是线程安全的。虽然您将无法获得中间值,但如果线程未同步,则最终可能会忽略一组值。使用atomic操作。