相关疑难解决方法(0)

x86上交换与比较和交换锁的相对性能

两种常见的锁定习语是:

if (!atomic_swap(lockaddr, 1)) /* got the lock */
Run Code Online (Sandbox Code Playgroud)

和:

if (!atomic_compare_and_swap(lockaddr, 0, val)) /* got the lock */
Run Code Online (Sandbox Code Playgroud)

其中val可能只是一个常量或锁定的新潜在所有者的标识符.

我想知道的是x86(和x86_64)机器上的两者之间是否存在任何显着的性能差异.我知道这是一个相当广泛的问题,因为单个cpu模型之间的答案可能差异很大,但这是我要求的原因之一,而不仅仅是我可以访问的几个cpus的基准测试.

c x86 assembly locking atomic

25
推荐指数
2
解决办法
6220
查看次数

`std :: memory_order_acquire`的语义是否需要x86/x86_64上的处理器指令?

众所周知,在x86上,操作load()store()内存屏障memory_order_consume, memory_order_acquire, memory_order_release, memory_order_acq_rel不需要处理器指令用于缓存和管道,并且汇编程序的代码总是对应std::memory_order_relaxed,并且这些限制仅对编译器的优化是必需的:http:// www. stdthread.co.uk/forum/index.php?topic=72.0

此代码反汇编代码确认store()(MSVS2012 x86_64):

std::atomic<int> a;
    a.store(0, std::memory_order_relaxed);
000000013F931A0D  mov         dword ptr [a],0  
    a.store(1, std::memory_order_release);
000000013F931A15  mov         dword ptr [a],1  
Run Code Online (Sandbox Code Playgroud)

但是这段代码并没有为load()(MSVS2012 x86_64)确认这一点,使用lock cmpxchg:

    int val = a.load(std::memory_order_acquire);
000000013F931A1D  prefetchw   [a]  
000000013F931A22  mov         eax,dword ptr [a]  
000000013F931A26  mov         edx,eax  
000000013F931A28  lock cmpxchg dword ptr [a],edx  
000000013F931A2E  jne         main+36h (013F931A26h)  

    std::cout << val << "\n";
Run Code Online (Sandbox Code Playgroud)

安东尼威廉姆斯说 …

c++ concurrency x86 memory-barriers c++11

7
推荐指数
1
解决办法
1034
查看次数

标签 统计

x86 ×2

assembly ×1

atomic ×1

c ×1

c++ ×1

c++11 ×1

concurrency ×1

locking ×1

memory-barriers ×1