同步原语:原子和互斥锁之间的延迟相等
synchronization primitives: Equal latencies between atomics and mutex lock
我正在努力提高对 C++ 中同步原语的理解。我测量了各种并发操作的延迟,例如:
- 对于原始
std::mutex
,.unlock()
和 .lock()
return 之间的时间
- 对于
std::condition_variable
,.notify_one()
和.wait()
return之间的时间
- 对于
std::binary_semaphore
,.release()
和.acquire()
之间的时间
- 对于
std::atomic_flag
,从.clear()
和.notify_one()
到.wait()
的时间以及从.test_and_set()
和.notify_one()
到.wait()
所有 这些延迟是相同的 (~4µs-15µs)。深入研究后,我发现信号量是用原子实现的,condition_variables 归结为互斥体。所以它归结为原子与互斥。进入相关函数时(on windows/MSVC),发现atomics使用WaitOnAddress
/WakeByAddress
而mutex使用SRW锁(AcquireSRWLockExclusive
).
天真地我会假设原子(尤其是 atomic_flag)具有最好的延迟特性,因为它们的功能非常有限。所以我的问题:
- 为什么他们一样快?可能是我的有限测试。
WaitOnAddress
/WakeByAddress
和SRW锁有什么区别?我认为它们都仅限于一个过程。我只在 WaitOnAddress
上找到 this article,但它几乎没有涉及到 SRW 锁的区别。
在无竞争状态下,SRWLock 只是一个原子 int
。因此,它的性能与 atomic
.
相同也就不足为奇了
在测试中引入一些争用后,您应该会看到非常不同的时间。
SRWLock 本质上是 futex 的 Windows 版本 - 同步原语完全保留在 user-space 中,直到发生争用。
WaitOnAddress
/ WakeByAddress
和 SRWLock 在内部非常相似,但用例不同 - SRWLock 直接实现 mutex
/shared_mutex
和 WaitOnAddress
/ WakeByAddress
对 condition_variable
.
更有用
我正在努力提高对 C++ 中同步原语的理解。我测量了各种并发操作的延迟,例如:
- 对于原始
std::mutex
,.unlock()
和.lock()
return 之间的时间 - 对于
std::condition_variable
,.notify_one()
和.wait()
return之间的时间 - 对于
std::binary_semaphore
,.release()
和.acquire()
之间的时间 - 对于
std::atomic_flag
,从.clear()
和.notify_one()
到.wait()
的时间以及从.test_and_set()
和.notify_one()
到.wait()
所有 这些延迟是相同的 (~4µs-15µs)。深入研究后,我发现信号量是用原子实现的,condition_variables 归结为互斥体。所以它归结为原子与互斥。进入相关函数时(on windows/MSVC),发现atomics使用WaitOnAddress
/WakeByAddress
而mutex使用SRW锁(AcquireSRWLockExclusive
).
天真地我会假设原子(尤其是 atomic_flag)具有最好的延迟特性,因为它们的功能非常有限。所以我的问题:
- 为什么他们一样快?可能是我的有限测试。
WaitOnAddress
/WakeByAddress
和SRW锁有什么区别?我认为它们都仅限于一个过程。我只在WaitOnAddress
上找到 this article,但它几乎没有涉及到 SRW 锁的区别。
在无竞争状态下,SRWLock 只是一个原子 int
。因此,它的性能与 atomic
.
在测试中引入一些争用后,您应该会看到非常不同的时间。
SRWLock 本质上是 futex 的 Windows 版本 - 同步原语完全保留在 user-space 中,直到发生争用。
WaitOnAddress
/ WakeByAddress
和 SRWLock 在内部非常相似,但用例不同 - SRWLock 直接实现 mutex
/shared_mutex
和 WaitOnAddress
/ WakeByAddress
对 condition_variable
.