Ami*_*sti 4 c++ multithreading mutex raii thread-safety
我有一个命名空间,下面的 func1 和 func2 将从不同的线程调用。
#include<thread>
namespace test{
std::mutex mu;
void func1(){
std::lock_guard<mutex>lock(mu);
//the whole function needs to be protected
}
void func2() {
mu.lock();
//some code that should not be executed when func1 is executed
mu.unlock();
//some other code
}
}
Run Code Online (Sandbox Code Playgroud)
使用此互斥锁(一次与 lock_guard 一起使用并在其外部)来保护这些关键部分是否安全?如果不是如何实现这个逻辑?
是的,您可以在不同的函数中有效地混合和匹配不同的保护实例(例如lock_guard、unique_lock 等...)std::mutex。我偶尔遇到的一种情况是,当我想使用std::lock_guard大多数方法,但使用 std::condition_variable期望 astd::unique_lock作为其wait方法时。
为了详细说明 Oblivion 所说的内容,我通常会在函数中引入一个新的作用域块,以便使用std::lock_guard一致。例子:
void func2() {
{ // ENTER LOCK
lock_guard<std::mutex> lck;
//some code that should not be executed when func1 is executed
} // EXIT LOCK
// some other (thread safe) code
}
Run Code Online (Sandbox Code Playgroud)
使用上述模式的优点是,如果在锁定的代码关键部分内有任何异常抛出,则lck仍会调用 的析构函数,从而解锁互斥体。