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

时间:2016-05-27 01:45:40

标签: c++ multithreading mutex

据我所知,当我有一个受std::lock_guardstd::unique_lock std::mutex保护的线程集合时,互斥锁通过明确解锁或锁定来解锁超出范围,然后通知等待线程。

此通知是notify_one还是notify_all

我怀疑前者避免快点等待,但想确定。

2 个答案:

答案 0 :(得分:2)

您似乎要问的是,当线程T0锁定了互斥M时,线程T1..Tn是否被阻止尝试锁定M,当{ {1}}解锁T0?显然只有一个线程可以成功锁定M,因此系统没有理由通知" (即安排)不止一个服务员。但是,您的问题并非针对任何一个平台,因此答案可能必须依赖于实施。"

答案 1 :(得分:2)

这取决于实施。等待线程可以在mutex :: lock()调用上下文内的用户空间中主动等待一段时间,以便解锁互斥锁,一旦解锁,几个主动等待的线程就可以同时检测到它时间,但只有一个能够锁定它。否则,在活动周期通过后,mutex.lock()发出系统调用,OS将该线程置于该互斥锁的等待列表中。当它被解锁时,只有一个线程被唤醒/通知以获得锁定。