我对 __ATOMIC_SEQ_CST 的理解正确吗? (我想用它+原子写一个互斥体)
Is my understanding of __ATOMIC_SEQ_CST correct? (I'd like to write a mutex with it + atomics)
为了好玩,我正在编写自己的线程库,供我和一两个朋友使用。我想写的第一件事是互斥锁
看来我正在生成我想要的程序集。 __atomic_fetch_add
似乎生成 lock xadd
,__atomic_exchange
似乎生成 xchg
(不是 cmpxchg)。我将两者与 __ATOMIC_SEQ_CST
一起使用(现在我会坚持使用)
如果我使用 __ATOMIC_SEQ_CST
gcc 或 clang 会理解这些是同步函数吗?如果我写 lock(); global++; unlock();
,编译器会在 lock/unlock 函数之前或之后移动 global++;
吗?我是否需要出于任何原因致电 __atomic_thread_fence(__ATOMIC_SEQ_CST);
或 __sync_synchronize();
? (他们似乎在 x86-64 上做同样的事情)。 https://gcc.gnu.org/wiki/Atomic/GCCMM/AtomicSync 似乎表明我的理解是正确的,但它很容易误读文档,我有时想知道范围是否在这些规则中起作用。
我认为在 lock/unlock 之间使用代码的那些内在行为将与 pthread 互斥体的行为方式相同 lock/unlock?
If I am using __ATOMIC_SEQ_CST will gcc or clang understand these are synchronizing function?
是的,这就是这些原语具有内存排序语义的全部原因。
内存排序语义完成两件事:(1) 确保编译器发出包含适当屏障的指令,以防止 CPU 重新排序; (2) 确保编译器优化不会以屏障应禁止的方式将代码移过这些指令。
If I write lock(); global++; unlock(); will any compilers move global++; before or after the lock/unlock function?
他们不会。同样,这就是能够指定内存顺序的全部意义所在。
Do I need to call __atomic_thread_fence(__ATOMIC_SEQ_CST); or __sync_synchronize(); for any reason?
不在此设置中,不。
为了好玩,我正在编写自己的线程库,供我和一两个朋友使用。我想写的第一件事是互斥锁
看来我正在生成我想要的程序集。 __atomic_fetch_add
似乎生成 lock xadd
,__atomic_exchange
似乎生成 xchg
(不是 cmpxchg)。我将两者与 __ATOMIC_SEQ_CST
一起使用(现在我会坚持使用)
如果我使用 __ATOMIC_SEQ_CST
gcc 或 clang 会理解这些是同步函数吗?如果我写 lock(); global++; unlock();
,编译器会在 lock/unlock 函数之前或之后移动 global++;
吗?我是否需要出于任何原因致电 __atomic_thread_fence(__ATOMIC_SEQ_CST);
或 __sync_synchronize();
? (他们似乎在 x86-64 上做同样的事情)。 https://gcc.gnu.org/wiki/Atomic/GCCMM/AtomicSync 似乎表明我的理解是正确的,但它很容易误读文档,我有时想知道范围是否在这些规则中起作用。
我认为在 lock/unlock 之间使用代码的那些内在行为将与 pthread 互斥体的行为方式相同 lock/unlock?
If I am using __ATOMIC_SEQ_CST will gcc or clang understand these are synchronizing function?
是的,这就是这些原语具有内存排序语义的全部原因。
内存排序语义完成两件事:(1) 确保编译器发出包含适当屏障的指令,以防止 CPU 重新排序; (2) 确保编译器优化不会以屏障应禁止的方式将代码移过这些指令。
If I write lock(); global++; unlock(); will any compilers move global++; before or after the lock/unlock function?
他们不会。同样,这就是能够指定内存顺序的全部意义所在。
Do I need to call __atomic_thread_fence(__ATOMIC_SEQ_CST); or __sync_synchronize(); for any reason?
不在此设置中,不。