繁体   English   中英

从bitset(C ++)访问(读取)位是否安全,可以由不同的线程修改

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM