我想知道如果我尝试在多个线程的字符/整数中设置位,我会丢失任何修改吗?我最初将全为零,线程只会将其设置为 1。系统架构是 x64。
谢谢,戈库尔。
在 x64(和 x86)上,对 int 的操作是原子的。这意味着读取和写入是独立的原子,而不是组合。(例如,如果您有两个线程同时写入一个 int,您将看不到一个的一半和另一个的一半——您总是会看到一个完整的 int 或另一个。)
但是,读取和写入是两个独立的操作。您可以执行一些互锁的操作(导致读取和写入成为一个原子操作),但我不认为按位逻辑属于可以以这种方式执行的操作集。
我认为如果你希望这个操作是原子的,你将不得不锁定一些互斥锁/监视器并执行读/写。
您必须使用互斥锁或类似的同步机制,或原子操作。对于前者,有现成的 POSIX 和 Windows 库并且非常标准。对于后者,大多数编译器会提供一些函数(例如http://gcc.gnu.org/wiki/Atomic)、内联汇编模式或其他方便的方式来使用它们,您总是可以退回到链接到已编译的对象从汇编语言开始。
您绝对无法避免这种显式同步。即使说 XOR 以某种方式直接和原子地对 CPU 内核最内层内存缓存中的值进行操作(它没有),您也需要保证该值与其他 CPU 内核的缓存同步。只有那些显式同步缓存的 CPU 指令对您有用 - 通过上面提到的库选项之一使用它们是最简单的。