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

Som*_*ing 8 c++ mutex

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

我的问题是,以下代码是否不仅会阻止func1() OR func2()并行执行多次,还会阻止func1() AND func2()同时执行?

#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();
}
Run Code Online (Sandbox Code Playgroud)

据我了解,许多人通常从 Stackoverflow 复制代码,在添加 @Al_Bundy 的输入后,我添加了示例代码的另一个版本 - 使用 lock_guard,它在函数结束时被破坏,从而确保在函数结束时释放互斥锁,并且守卫被摧毁。这是更安全、更好的做法,因为它在函数返回或退出的任何情况下都会释放互斥锁,即使它因异常而退出。

#include <mutex>

std::mutex my_mutex;

void func1() {
    std::lock_guard<std::mutex> locker(my_mutex);
    // do something ...
}

void func2() {
    std::lock_guard<std::mutex> locker(my_mutex);
    // do something ...
}
Run Code Online (Sandbox Code Playgroud)

Rei*_*ica 3

您的两个函数都锁定同一个互斥体,因此最多可以同时执行其中一个函数。

互斥体根本不关心函数等。互斥体本身要么被锁定,要么被解锁。任何在互斥体已锁定时对其进行锁定的尝试都将被阻止,直到互斥体解锁为止。您正在使用一个互斥锁,因此一旦它被my_mutex.lock()代码中的任何位置锁定,所有进一步的调用都将my_mutex.lock()被阻止,直到my_mutex.unlock()被调用。

一旦发生这种情况,调用内阻塞的线程之一lock()解除阻塞,获取(=锁定)互斥锁,然后继续。其他人将保持封锁状态。

  • @SomethingSomething 但这不是真的。“如果锁被已经拥有互斥体的线程调用,则行为是未定义的:例如,程序*可能*死锁。” https://en.cppreference.com/w/cpp/thread/mutex/lock (2认同)