我可以在不同的方法中使用相同的互斥锁吗?

时间:2014-10-16 02:53:56

标签: c++ linux multithreading mutex

情况:我有两种方法: 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;
};

2 个答案:

答案 0 :(得分:2)

是的,您可以(并且应该)使用相同的互斥锁。虽然使用RAII获取它是更优选的(如果您的互斥锁是std::mutex,那么您可以使用std::lock_guardpthread_mutex_t实现lock()和{{1}的包装器}}):

unlock()

这样,您不仅可以在代码中的任何位置放置void Class::method1() { std::lock_guard<std::mutex> lock(mutex1); ... } 语句,还可以实现异常安全(如果方法抛出异常,互斥锁将被解锁)。

答案 1 :(得分:1)

这正是应该如何使用互斥锁 - 保护数据不被一个线程访问,而另一个线程正在或可能正在修改它。只需修复method2中的错误(最好是使用RAII获取互斥锁,并在复制返回值后让互斥锁持有者的析构函数解锁互斥锁。)