【发布时间】:2022-01-18 03:07:40
【问题描述】:
我正在努力提高我对 C++ 中同步原语的理解。我测量了各种并发操作的延迟,例如:
- 对于原始
std::mutex,.unlock()和.lock()返回之间的时间 - 对于
std::condition_variable,.notify_one()和.wait()返回之间的时间 - 对于
std::binary_semaphore,.release()和.acquire()之间的时间 - 对于
std::atomic_flag,从.clear()和.notify_one()到.wait()以及从.test_and_set()和.notify_one()到.wait()的时间
所有这些延迟都是相同的 (~4µs-15µs)。经过一番挖掘,我发现信号量是用原子实现的,而 condition_variables 归结为互斥体。所以它归结为原子与互斥体。在进入相关函数时(在 windows/MSVC 上),我发现 atomics 使用 WaitOnAddress/WakeByAddress 而 mutex 使用 SRW 锁 (AcquireSRWLockExclusive)。
我天真地假设原子(尤其是 atomic_flag)具有最好的延迟特性,因为它们的功能非常有限。所以我的问题:
- 为什么它们同样快?可能是我有限的测试。
-
WaitOnAddress/WakeByAddress和SRW锁有什么区别?我认为它们都仅限于一个过程。我只在WaitOnAddress上找到了this article,但几乎没有涉及到与SRW锁的区别。
【问题讨论】:
标签: c++ windows concurrency