这样的操作是否安全? (换句话说,如果在不同线程上修改了位集,则没有机会读取某些虚假的中间值)?具体来说,我只对读取是否安全感兴趣,换句话说,我不是在问从两个单独的线程写入位集是否安全。
例如:线程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
是,而不是线程安全。
这是标准关于访问位集的说明(第20.9.2.2-51节):
因此,在另一个执行线程中从一个位集对象读取数据同时进行写入操作是一种数据竞争(这会触发未定义的行为)。即使所有线程都使用不同的索引访问位集对象。