从可能被不同线程修改的位集(C++)中访问(读取)一点是否安全

Eug*_*ger 5 c++ stl bit-manipulation thread-safety

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

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

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);
// ...
Run Code Online (Sandbox Code Playgroud)

LWi*_*sey 1

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

\n\n

这是标准关于访问位集的规定 (\xc2\xa7 20.9.2.2-51):

\n\n
\n

为了确定数据争用的存在,通过结果引用的任何访问或更新都可能分别访问或修改整个底层位集。

\n
\n\n

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

\n