Edit2:对不起,不,这无济于事。您需要围绕访问的互斥锁 - 编译器生成的代码有可能(很可能)将指针加载到寄存器[或其他存储,如堆栈,如果它是没有寄存器的处理器],然后访问指针指向的内存同时,指针正在被另一个线程更新。保证指针正确的唯一方法是使用互斥锁或类似结构来关闭整个访问块。其他任何事情都有可能失败。
正如 syam 所说,该标准不能保证即使读取 hte 指针指向的 32 位值也是原子的——它取决于系统的实现。但是,如果您问“我会得到一个旧值还是新值”,那么至少 x86 和 x86-64 将保证这一点。其他机器架构可能不会(SMP 68000 处理器上的 32 位 int 实现不能保证,因为一次写入是 16 位,第二个处理器可能已经写入了一半,但不是另一个 - 不是我知道一个有 68000 个处理器的 SMP 系统正在构建中)。
(这InterlockedExchange
不是“标准”函数)将保证该线程的处理器具有对指针本身的独占访问权限,因此这样做是安全的——此时没有其他处理器能够访问指针。这就是 x86 架构中“锁定”指令的全部意义——它们是“安全的”(而且相当慢,但假设您不是每次都这样做……)。
编辑:请注意,您必须小心commonPointer
自己,因为编译器可能没有意识到您正在使用另一个线程来更新它。因此,您可能仍在读取 OLD 指针值。
调用一个函数[没有被内联到虚无]或声明指针volatile int * volatile commonPointer;
应该可以解决问题。[提示人们对我的使用答案投反对票volatile
,因为“解决方案没有问题,volatile
正如之前有人发布的那样]。
[见上面的编辑2]