C ++:防止同时执行多个函数

时间:2017-03-13 12:27:30

标签: c++ mutex

我问这个问题,因为我发现处理单个函数的所有互斥文档,我认为我的情况很常见。

我的问题是,以下代码是否不仅会阻止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();
}

3 个答案:

答案 0 :(得分:2)

是的,只要相同的互斥锁被锁定,就无法锁定其他地方,直到它被解锁。

答案 1 :(得分:2)

你的两个函数都锁定了相同的互斥锁,因此它们中的任何一个都可以在任何时候执行。

Mutexes根本不关心功能等。互斥锁本身可以锁定也可以解锁。在它已经锁定时锁定它的任何尝试都会阻塞,直到互斥锁解锁为止。您正在使用一个互斥锁,因此只要您的代码中的任何位置被my_mutex.lock()锁定,所有对my_mutex.lock()的进一步调用都会阻止,直到my_mutex.unlock()为止调用。

一旦发生这种情况,{em>一个在lock()调用中阻塞的线程将解锁,获取(=锁定)互斥锁,然后继续。其他人将被阻止。

答案 2 :(得分:1)

是的,在大多数情况下这是真的。但要注意互斥量有一个主人。 只要它是同一个线程,lock()就不会等待释放互斥锁。