当使用多个线程在多个核心和/或多个套接字上协同工作的并发,并行编程语言时,内存中被认为是原子的最大值是多少?
我的意思是:作为字节序列的字符串绝对不是原子的,因为在内存中写入该位置可能需要一些时间来更新字符串。因此,在读取和写入字符串时必须获取某种锁,以便其他线程看不到损坏的半成品结果。但是,堆栈上的字符串是原子的,因为AFAIK堆栈不是跨线程的内存共享区域。
最大的有保证的无锁单元是一位还是一个字节,还是取决于用于写入该字节的指令?例如,是否有可能一个线程读取一个整数而另一个线程正在逐位将值从寄存器移动到堆栈到共享内存,导致读取器线程看到半写值?
我想我在问x86_64上最大的原子值是什么以及保证是什么。
答案 0 :(得分:3)
x86-64中最大的原子指令是lock cmpxchg16b
,它以原子方式读写16个字节。
虽然它通常用于原子地更新内存中的16字节对象,但它也可以用于原子地读取这样的值。
要以原子方式更新值,请使用先前值加载rdx:rax,使用新值加载rcx:rbx。仅当先前值未发生变化时,该指令才会使用新值以原子方式更新内存位置。
要以原子方式读取16字节值,请使用相同的值加载rdx:rax和rcx:rbx。 (并不重要的是什么值,但0是一个不错的选择。)指令以原子方式将当前值读入rdx:rax。