【发布时间】:2010-11-09 12:02:04
【问题描述】:
假设我有一个位图,并且几个线程(在多个 CPU 上运行)正在对其进行设置。没有使用同步,也没有原子操作。此外,没有进行任何重置。据我了解,当两个线程试图在同一个字上设置两个位时,最终只有一个操作会坚持。原因是对于要设置的位,应该读取和写回整个字,因此当两个读取同时完成时,在写回时一个操作将覆盖另一个操作。对吗?
如果上述情况属实,那么字节操作是否也总是如此?也就是说,如果一个词是 2 个字节,并且每个线程都尝试将不同的字节设置为 1,那么它们在并发执行时是否也会相互覆盖,或者某些系统是否支持仅将结果写回一个词的一部分?
询问的原因是想弄清楚我必须放弃多少空间才能在位/字节/字映射操作中省略同步。
【问题讨论】:
-
在 C++11 中,对单独的
char对象的访问保证不是数据竞争。但在同一个char中,这当然是个问题。std::bitmap经常使用unsigned long块,使冲突的可能性增加 8 倍。在 asm 中,请参阅 How to set bits of a bit vector efficiently in parallel? 以了解处理两个线程相互更新到同一字节的想法。 (例如,做一些更新,mfence,然后回读以确保它们都通过了。但是 C++ 在让您在需要时混合原子负载和更宽的大小方面没有帮助。
标签: c++ memory assembly synchronization bit-manipulation