Concurrency “最大的”;原子的;类型?
当在并发并行编程语言中使用多个线程在多个内核和/或多个套接字上协同工作时,内存中被认为是原子的最大值是多少 我的意思是:字符串,作为一个字节序列,肯定不是原子的,因为写入内存中的那个位置可能需要一些时间来更新字符串。因此,在读取和写入字符串时必须获得某种类型的锁,以便其他线程不会看到已损坏的、未完成的结果。但是,堆栈上的字符串是原子的,因为堆栈不是线程之间的共享内存区域 最大的保证无锁单元是位还是字节,还是取决于写入该字节的指令?例如,一个线程是否可能读取一个整数,而另一个线程正在将值从寄存器逐位移动到堆栈到共享内存,从而导致读线程看到半写值Concurrency “最大的”;原子的;类型?,concurrency,x86-64,Concurrency,X86 64,当在并发并行编程语言中使用多个线程在多个内核和/或多个套接字上协同工作时,内存中被认为是原子的最大值是多少 我的意思是:字符串,作为一个字节序列,肯定不是原子的,因为写入内存中的那个位置可能需要一些时间来更新字符串。因此,在读取和写入字符串时必须获得某种类型的锁,以便其他线程不会看到已损坏的、未完成的结果。但是,堆栈上的字符串是原子的,因为堆栈不是线程之间的共享内存区域 最大的保证无锁单元是位还是字节,还是取决于写入该字节的指令?例如,一个线程是否可能读取一个整数,而另一个线程正在将值从寄存器逐
我想我是在问x86_64上最大的原子值是多少,保证是什么 x86-64中最大的原子指令是
lock cmpxchg16b
,它以原子方式读取和写入16个字节
虽然它通常用于自动更新内存中的16字节对象,但也可以用于自动读取此类值
要以原子方式更新值,请使用先前的值加载rdx:rax,使用新值加载rcx:rbx。只有在先前的值没有改变的情况下,指令才会用新值自动更新内存位置
要以原子方式读取16字节的值,请使用相同的值加载rdx:rax和rcx:rbx。(不管是什么值,但0是一个不错的选择。)该指令以原子方式将当前值读取到rdx:rax中。x86-64中最大的原子指令是
lock cmpxchg16b
,它以原子方式读取和写入16字节
虽然它通常用于自动更新内存中的16字节对象,但也可以用于自动读取此类值
要以原子方式更新值,请使用先前的值加载rdx:rax,使用新值加载rcx:rbx。只有在先前的值没有改变的情况下,指令才会用新值自动更新内存位置
要以原子方式读取16字节的值,请使用相同的值加载rdx:rax和rcx:rbx。(什么值无关紧要,但0是一个不错的选择。)指令以原子方式将当前值读入rdx:rax。最小值还是最大值?更新了问题。AFAIK取决于指令。除非硬件通过原子指令对两个处理器进行同步,否则无法保证两个处理器不会接触同一内存。x86中最小的原子单位是一个字节。如果64位整数没有穿过缓存线,则加载或存储是原子的。但不建议依赖于此:使用适当的std::atomic特性。您可以跨线程共享堆栈内存。将某些堆栈内存的地址传递给另一个线程,让另一个线程取消对指针的引用。最小或最大?更新问题。AFAIK取决于指令。除非硬件通过原子指令对两个处理器进行同步,否则无法保证两个处理器不会接触同一内存。x86中最小的原子单位是一个字节。如果64位整数没有穿过缓存线,则加载或存储是原子的。但不建议依赖于此:使用适当的std::atomic特性。您可以跨线程共享堆栈内存。将某些堆栈内存的地址传递给另一个线程,让另一个线程取消对指针的引用。有趣的事实:gcc和clang对9到16字节的对象使用
std::atomic
这个技巧。不过,这很难看,尤其是对于比mov
效率低得多的加载(但通常还是比单独使用锁好)。仍然。在MSVC中,atomic
最多只能释放8个字节的锁。相关:和。有趣的事实:gcc和clang对9到16个字节的对象使用std::atomic
这个技巧。不过,这很难看,尤其是对于比mov
效率低得多的加载(但通常还是比单独使用锁好)。仍然。在MSVC中,atomic
最多只能释放8个字节的锁。相关:和。