同步原语:原子和互斥锁之间的延迟相等

synchronization primitives: Equal latencies between atomics and mutex lock

我正在努力提高对 C++ 中同步原语的理解。我测量了各种并发操作的延迟,例如:

所有 这些延迟是相同的 (~4µs-15µs)。深入研究后,我发现信号量是用原子实现的,condition_variables 归结为互斥体。所以它归结为原子与互斥。进入相关函数时(on windows/MSVC),发现atomics使用Wait­On­Address/Wake­By­Address而mutex使用SRW锁(AcquireSRWLockExclusive).

天真地我会假设原子(尤其是 atomic_flag)具有最好的延迟特性,因为它们的功能非常有限。所以我的问题:

在无竞争状态下,SRWLock 只是一个原子 int。因此,它的性能与 atomic.

相同也就不足为奇了

在测试中引入一些争用后,您应该会看到非常不同的时间。

SRWLock 本质上是 futex 的 Windows 版本 - 同步原语完全保留在 user-space 中,直到发生争用。

Wait­On­Address / Wake­By­Address 和 SRWLock 在内部非常相似,但用例不同 - SRWLock 直接实现 mutex/shared_mutexWait­On­Address / Wake­By­Addresscondition_variable.

更有用