Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Concurrency “最大的”;原子的;类型?_Concurrency_X86 64 - Fatal编程技术网

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个字节的锁。相关:和。