【问题标题】:Can I use same mutex in different methods?我可以在不同的方法中使用相同的互斥锁吗?
【发布时间】:2014-10-16 02:53:56
【问题描述】:

情况:我有两种方法:method1加载配置值; method2 返回加载配置的值。 这两种方法都可能被不同的线程调用。

问题:我想使用一个互斥锁来锁定/解锁两种方法。所以method1被锁定时method2被调用时也应该被锁定。当我读到互斥锁时,我很困惑,当他们说我锁定代码区域直到调用解锁时。

问题:当我锁定方法1时,我是否也锁定了方法2?

期望:我希望在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;
};

【问题讨论】:

  • 您不打算使用任何一种方法调用 other,对吧?如果没有,单个互斥锁似乎就足够了,在进入任一方法时都会被锁定。
  • 加载器是否设计为将输入文件作为参数?如果不是,似乎围绕 getter 的惰性初始化器可能是更好的选择,如果您只需要通过方法 2 获取,这将降低复杂性。
  • 我想要发生的是在method1更新将由method2返回的配置数据时调用method2。
  • “他们说我会锁定代码区域,直到调用 unlock”——将互斥锁想象成一根说话棒。你在说话前拿起棍子,说完就递给它。你说话的时间就像代码区域。
  • 请注意:method2() 将使互斥锁处于锁定状态,因为它在解锁之前返回,因此永远不会调用 pthread_mutex_unlock(mutex1)。

标签: c++ linux multithreading mutex


【解决方案1】:

是的,您可以(并且应该)使用相同的互斥锁。尽管使用 RAII 获取它更可取(如果您的互斥锁是 std::mutex 或围绕 pthread_mutex_t 实现 lock()unlock() 的包装器,则可以使用 std::lock_guard):

void Class::method1() {
    std::lock_guard<std::mutex> lock(mutex1);
    ...
}

这样,您不仅可以将return 语句放在代码中的任何位置,还可以实现异常安全(如果方法抛出异常,互斥锁将被解锁)。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-10
      • 1970-01-01
      • 2011-01-15
      • 2013-08-22
      • 2012-08-28
      相关资源
      最近更新 更多