情况:我有两种方法: method1 加载配置值; method2 会返回已加载配置的值。 这两种方法可能由不同的线程调用。
问题:我想使用一个互斥锁来锁定/解锁两个方法。所以 当method1被锁定时 ,当 方法2被调用时,它也应该被锁定 。当我读到有关互斥的内容时,当我说我锁定代码区域直到调用解锁时,我感到困惑。
问题:当我锁定method1时,我是否也锁定了method2?
期望:我想要发生的是当method1更新将由method2返回的配置数据时调用的method2。
示例代码:
void Class::method1() {
pthread_mutex_lock(mutex1);
string1 = "a value";
pthread_mutex_unlock(mutex1);
};
void Class::method2(string& aString) {
pthread_mutex_lock(mutex1);
aString = string1;
pthread_mutex_unlock(mutex1);
return;
};
答案 0 :(得分:2)
是的,您可以(并且应该)使用相同的互斥锁。虽然使用RAII获取它是更优选的(如果您的互斥锁是std::mutex
,那么您可以使用std::lock_guard或pthread_mutex_t
实现lock()
和{{1}的包装器}}):
unlock()
这样,您不仅可以在代码中的任何位置放置void Class::method1() {
std::lock_guard<std::mutex> lock(mutex1);
...
}
语句,还可以实现异常安全(如果方法抛出异常,互斥锁将被解锁)。
答案 1 :(得分:1)
这正是应该如何使用互斥锁 - 保护数据不被一个线程访问,而另一个线程正在或可能正在修改它。只需修复method2
中的错误(最好是使用RAII获取互斥锁,并在复制返回值后让互斥锁持有者的析构函数解锁互斥锁。)