并行修改整数中的位

时间:2010-11-09 05:34:29

标签: c++ concurrency bitmask

我想知道我是否尝试在多个线程中设置char / integer内的位,我会丢失任何修改吗?我最初将全部为零,线程只会将其设置为1。 系统架构是x64。

谢谢, 戈库尔。

2 个答案:

答案 0 :(得分:3)

on on x64(和x86)对int的操作是原子的。这意味着读取和写入是独立的原子,而不是组合。 (例如,如果你有两个线程同时写一个int,你将看不到另一半的一半 - 你将总是看到一个完整的int或另一个。)

然而,阅读和写作是两个独立的操作。您可以执行一些互锁的操作(使读取和写入成为一个原子操作),但我不认为按位逻辑属于可以这种方式执行的操作集。

如果您希望此操作是原子操作,我认为您必须锁定某些互斥锁/监视器并执行读/写操作。

答案 1 :(得分:1)

您必须使用互斥锁或类似的同步机制或原子操作。对于前者,有POSIX和Windows库随时可用且非常标准。对于后者,大多数编译器将提供一些函数(例如http://gcc.gnu.org/wiki/Atomic),内联汇编模式或其他方便的方式来使用它们,并且您总是可以回退到链接到从汇编语言编译的对象。

你绝对无法避免这种显式同步。即使说XOR以某种方式直接和原子地操作CPU核心内部存储器高速缓存中的值(它没有),您需要保证该值与其他CPU核心的高速缓存同步。只有那些明确同步缓存的CPU指令才对您有用 - 最容易通过上面提到的库选项之一使用它们。