当互斥量解锁时,它是 notify_all 还是 notify_one?
When a mutex unlocks does it notify_all or notify_one?
据我所知,当我有一个线程集合受 std::lock_guard
或 std::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 获得锁。
据我所知,当我有一个线程集合受 std::lock_guard
或 std::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 获得锁。