【问题标题】:c++ lock across methodsc++锁跨方法
【发布时间】:2016-08-01 06:53:53
【问题描述】:

我有一个不是线程保存的数据结构。多个线程以 2 种方法读取和写入该数据结构。 (调用的顺序相当随机)我解决这个问题的方法是使用如下所示的 unique_lock:

struct test {

  void func1() {
    boost::unique_lock<boost::mutex> lock(_mutex);
    // modify data-structure
  }


  void func2() {
    boost::unique_lock<boost::mutex> lock(_mutex);  
    // modify data-structure
  }

   boost::mutex _mutex;
}

但我认为,使用此代码,一次只允许一个线程访问数据,因为互斥锁在两种方法之间共享。
但不知何故,程序可能会触发数据结构中的错误,我无法在我的单线程测试用例中重现......

我是否必须在两种方法中都使用 boost::unique_lock 然后调用

lock()
unlock()

在吗?

【问题讨论】:

  • 对于这种情况,您也可以使用std::mutexstd::lock_guard。没有必要对 STL 中的任何内容使用 boost
  • @JoachimPileborg 为什么在这种情况下会有所不同? scoped_lock 应该可以替换为 unique_lock
  • 可能是各种其他错误,例如类方法中某处的未定义行为。例如。如果您有越界访问,它可能会产生随机影响。
  • 一般调试建议:启用所有警告并修复所有警告,使用 Valgrind、ASAN 和 TSAN。

标签: c++ multithreading boost locking


【解决方案1】:

如上所述,锁定机制不是导致错误的原因。
好吧,实际上是 ;)
在我调用的关键部分之外

datastructure.empty()

因为在早期版本中,此方法线程保存。

感谢“Kerrek SB”对 thread-sanitizer 的指点,因为它的输出引导我找到了错误。

【讨论】:

    猜你喜欢
    • 2014-06-12
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多