[英]Is it safe to access (read) a bit from a bitset (C++) which may be modified by a different thread
这种操作是否安全? (换句话说,如果在不同的线程上修改了bitset,则没有机会读取一些虚假的中间值)? 具体来说,我只对读取是否安全感兴趣,换句话说,我不会问从两个独立的线程写入一个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);
// ...
Bitset不提供原子修改,因此位的更改可能会锁定附近位中的较旧值。
如果存在重置(5),则可能意味着线程1从未看到设置位。
以这种方式使用std::bitset
不是线程安全的。
这是标准关于访问bitset的内容(§20.9.2.2-51):
为了确定数据竞争的存在,通过结果引用的任何访问或更新可能分别访问或修改整个底层位集。
因此,在另一个执行线程中从其读取时写入bitset对象是数据争用(触发未定义的行为)。 即使所有线程都使用不同的索引访问bitset对象。
没有STL容器是线程安全的。 虽然您不会获得中间值,但如果线程未同步,您最终可能会忽略一组值。 使用atomic
操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.