我想知道如果我试图从多个线程中设置字符/整数中的位,我会丢失任何修改吗?我一开始会有全零,线程只会把它设置为1。系统架构是x64。
谢谢,Gokul。
发布于 2010-11-09 13:37:44
在x64 (和x86)上,int上的操作是原子的。这意味着读取和写入是独立的原子操作,而不是组合在一起。(例如,如果您有两个线程同时写入一个int,您将不会看到一个线程的一半和另一个线程的一半--您总是会看到一个完整的int或另一个。)
但是,读取和写入是两个独立的操作。您可以执行一些互锁的操作(导致读和写是一个原子操作),但我不相信按位逻辑属于可以以这种方式执行的操作集。
我认为如果你想让这个操作是原子的,你必须锁定一些互斥/监视器并执行读/写操作。
发布于 2010-11-09 14:36:35
您必须使用互斥或类似的同步机制,或者使用原子操作。对于前者,有现成的POSIX和Windows库,而且非常标准。对于后者,大多数编译器都会提供一些函数(例如http://gcc.gnu.org/wiki/Atomic)、内联汇编模式或其他方便的方式来使用它们,而且您总是可以退回到链接到从汇编语言编译的对象。
你肯定无法避免这种显式的同步。即使以某种方式对CPU核心最内层内存缓存中的值进行XOR操作(实际上并非如此),您也需要确保该值与其他CPU核心的缓存同步。只有那些显式同步缓存的CPU指令才对您有用-通过上面提到的库选项之一使用它们是最容易的。
https://stackoverflow.com/questions/4130806
复制相似问题