【发布时间】: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::mutex和std::lock_guard。没有必要对 STL 中的任何内容使用 boost -
@JoachimPileborg 为什么在这种情况下会有所不同?
scoped_lock应该可以替换为unique_lock。 -
可能是各种其他错误,例如类方法中某处的未定义行为。例如。如果您有越界访问,它可能会产生随机影响。
-
一般调试建议:启用所有警告并修复所有警告,使用 Valgrind、ASAN 和 TSAN。
标签: c++ multithreading boost locking