我问这个问题,因为我发现处理单个函数的所有互斥文档,我认为我的情况很常见。
我的问题是,以下代码是否不仅会阻止func1()
或func2()
多次并行执行,还会阻止func1()
和{{1}从同时执行?
func2()
据我所知,很多人通常从Stackoverflow复制代码,我在添加@Al_Bundy的输入后添加了我的示例代码的另一个版本 - 使用lock_guard,当函数结束时会被破坏,从而确保你的互斥锁被释放时功能结束,防护装置被破坏。它更加安全,因为你的函数可以获得异常,并且当你手动解锁而不是使用锁定保护时,你的互斥锁可以保持锁定状态:
#include <mutex>
std::mutex my_mutex;
void func1() {
my_mutex.lock();
// do something ...
my_mutex.unlock();
}
void func2() {
my_mutex.lock();
// do something ...
my_mutex.unlock();
}
答案 0 :(得分:2)
是的,只要相同的互斥锁被锁定,就无法锁定其他地方,直到它被解锁。
答案 1 :(得分:2)
你的两个函数都锁定了相同的互斥锁,因此它们中的任何一个都可以在任何时候执行。
Mutexes根本不关心功能等。互斥锁本身可以锁定也可以解锁。在它已经锁定时锁定它的任何尝试都会阻塞,直到互斥锁解锁为止。您正在使用一个互斥锁,因此只要您的代码中的任何位置被my_mutex.lock()
锁定,所有对my_mutex.lock()
的进一步调用都会阻止,直到my_mutex.unlock()
为止调用。
一旦发生这种情况,{em>一个在lock()
调用中阻塞的线程将解锁,获取(=锁定)互斥锁,然后继续。其他人将被阻止。
答案 2 :(得分:1)
是的,在大多数情况下这是真的。但要注意互斥量有一个主人。 只要它是同一个线程,lock()就不会等待释放互斥锁。