【发布时间】: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 将在函数结束时解锁互斥锁,即使它以抛出一些异常结束,对吧?比手动解锁安全多了
-
是的,完全正确。我只使用它。