据我所知,当我有一个受std::lock_guard
或std::unique_lock
std::mutex
保护的线程集合时,互斥锁通过明确解锁或锁定来解锁超出范围,然后通知等待线程。
此通知是notify_one
还是notify_all
?
我怀疑前者避免快点等待,但想确定。
答案 0 :(得分:2)
您似乎要问的是,当线程T0
锁定了互斥M
时,线程T1..Tn
是否被阻止尝试锁定M
,当{ {1}}解锁T0
?显然只有一个线程可以成功锁定M
,因此系统没有理由通知" (即安排)不止一个服务员。但是,您的问题并非针对任何一个平台,因此答案可能必须依赖于实施。"
答案 1 :(得分:2)
这取决于实施。等待线程可以在mutex :: lock()调用上下文内的用户空间中主动等待一段时间,以便解锁互斥锁,一旦解锁,几个主动等待的线程就可以同时检测到它时间,但只有一个能够锁定它。否则,在活动周期通过后,mutex.lock()发出系统调用,OS将该线程置于该互斥锁的等待列表中。当它被解锁时,只有一个线程被唤醒/通知以获得锁定。