当互斥量解锁时,它是 notify_all 还是 notify_one?

When a mutex unlocks does it notify_all or notify_one?

据我所知,当我有一个线程集合受 std::lock_guardstd::unique_lock 保护而不是 std::mutex 并且通过显式解锁或通过锁定超出范围,然后通知等待线程。

此通知是 notify_one 还是 notify_all

我怀疑前者是为了避免快点等待,但想确定一下。

您似乎要问的是,当线程 T0 已锁定互斥量 M 并且线程 T1..Tn 尝试锁定 M 时被阻止,会发生什么T0 何时解锁 M?显然只有一个线程可以成功锁定M,所以系统没有理由"notify"(即调度)多个等待者。但是,您的问题并不特定于任何一个平台,因此答案可能必须是 "it's implementation dependent."

这取决于实施。等待线程可以在 mutex::lock() 调用上下文中的用户 space 中主动等待一段时间,以便解锁互斥量,一旦解锁,几个主动等待线程可以在同时,但只有一个人可以锁定它。否则在活动期结束后 mutex.lock() 发出系统调用并且 OS 将线程放入该互斥锁的等待列表中。解锁后只有一个线程 awaken/notified 获得锁。