【问题标题】:C++: Preventing multiple functions from being executed at the same timeC++:防止多个函数同时执行
【发布时间】:2017-03-13 12:27:30
【问题描述】:

我问这个问题是因为我发现的所有 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();
}

据我了解,很多人通常从 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 ...
}

【问题讨论】:

  • 你为什么不用std::lock_guard
  • 似乎是一个非常好的输入 - 如果我理解正确,lock_guard 将在函数结束时解锁互斥锁,即使它以抛出一些异常结束,对吧?比手动解锁安全多了
  • 是的,完全正确。我使用它。

标签: c++ mutex


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2010-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-21
        • 2013-02-13
        • 2014-04-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多