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

C++: Preventing multiple functions from being executed at the same time

我问这个问题是因为我找到的所有 mutex 文档都处理单个函数,我认为我的情况很常见。

我的问题是下面的代码是否不仅会阻止 func1()func2() 被并行执行多次,还会阻止 func1()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();
}

据我所知,许多人通常从 Whosebug 复制代码,我添加了另一个版本的示例代码,在添加 @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 ...
}

是的,只要同一个互斥量被锁定,就无法从其他任何地方锁定它,直到它被解锁。

您的两个函数都锁定了同一个互斥量,因此在任何时候最多只能执行其中一个。

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

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

是的,在大多数情况下是这样。但要注意互斥体有一个 thead 所有者。 只要是同一个线程,lock() 就不会等待互斥量被释放。