Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当互斥锁解锁时,它是通知所有还是通知一个?_C++_Multithreading_Mutex - Fatal编程技术网

C++ 当互斥锁解锁时,它是通知所有还是通知一个?

C++ 当互斥锁解锁时,它是通知所有还是通知一个?,c++,multithreading,mutex,C++,Multithreading,Mutex,据我所知,当我有一个受std::lock_guard或std::unique_lock over std::mutex保护的线程集合,并且该互斥锁通过显式解锁或锁超出范围而解锁时,等待的线程会得到通知 这是通知单还是通知单 我怀疑前者是为了避免匆忙等待,但我想确定一下。您似乎想问的是,当线程T0锁定互斥锁M,线程T1..Tn被阻止试图锁定M时,T0解锁M时会发生什么?显然,只有一个线程可以成功锁定M,因此系统没有理由通知,即安排多个服务员。但是,您的问题并不特定于任何一个平台,因此答案可能必须取

据我所知,当我有一个受std::lock_guard或std::unique_lock over std::mutex保护的线程集合,并且该互斥锁通过显式解锁或锁超出范围而解锁时,等待的线程会得到通知

这是通知单还是通知单


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

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

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

一次只有一个线程可以锁定互斥锁。当互斥锁解锁时,只允许一个线程再次锁定它。如果有多个线程同时等待解锁,则只有一个线程将获得新锁,但无法保证将获得哪个线程。这个问题毫无意义,因为notify_one和notify_都是std::condition_变量的特性,而不是std::mutex。我指的是同一种机制。是否有一个内部列表,并且恰好有一个得到通知。或者它只是唤醒一切,让他们自己解决问题。该标准不需要任何特定的实现。标准要求的是,在操作结束时,一个线程以互斥锁结束,其他线程仍在等待。实现特定可能最有意义。我所要做的就是找到实际的规格-但这是另一个问题