我对 __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?

不在此设置中,不。