如果我有一个多线程程序通过引用读取缓存类型的内存.我可以通过主线程更改此指针,而不会冒任何其他线程读取意外值的风险.
在我看来,如果更改是原子的,其他线程将读取旧值或更新值; 从不随机内存(或空指针),对吧?
我知道无论如何我应该使用同步方法,但我仍然很好奇.
指针变化是原子的吗?
更新:我的平台是64位Linux(2.6.29),虽然我也想要一个跨平台的答案:)
我正在使用原子(双)比较和交换指令实现无锁机制,例如cmpxchg16b
我目前正在汇编中编写它,然后将其链接进去.但是,我想知道是否有办法让编译器自动为我执行此操作?例如,带有'原子级'的环绕代码块,并让它弄清楚如何将代码实现为底层处理器体系结构中的原子指令(或者如果底层arch不支持它,则在编译时生成错误)?
PS我知道gcc有一些内置函数(至少对于CAS)
http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Atomic-Builtins.html#Atomic-Builtins
在Java中,更新double和long变量可能不是原子变量,因为double/long被视为两个独立的32位变量.
http://java.sun.com/docs/books/jls/second_edition/html/memory.doc.html#28733
在C++中,如果我使用的是32位Intel Processor + Microsoft Visual C++编译器,那么更新双(8字节)操作原子?
我找不到关于这种行为的规范.
当我说"原子变量"时,这就是我的意思:
线程A试图将1写入变量x.线程B试图将2写入变量x.
我们将从变量x得到值1或2,但不是未定义的值.