当互斥锁解锁时,它会notify_all或notify_one

When a mutex unlocks does it notify_all or notify_one?

本文关键字:notify all one 它会 解锁      更新时间:2023-10-16

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

此通知是notify_one还是notify_all

我怀疑前者避免匆忙等待,但想确定一下。

您似乎在问的是,当线程T0锁定互斥锁M,并且线程T1..Tn在尝试锁定M时被阻止时,当T0解锁M时会发生什么? 显然只有一个线程可以成功锁定M,因此系统没有理由"通知"(即调度)多个服务员。 但是,您的问题并非特定于任何一个平台,因此答案可能必须是"它取决于实现"。

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