【发布时间】:2014-02-02 00:08:14
【问题描述】:
我有许多对象,每个对象都与一个 boost::shared_mutex 相关联(我需要共享/唯一锁定功能)。
在代码中的某些情况下,我需要一次获得多个对象的唯一所有权。
for (FileMetaData* entry : smd->fileSet) {
entry->fileMutex.lock();
}
// some critical work
for (FileMetaData* entry : smd->fileSet) {
entry->fileMutex.unlock();
}
当不同的线程试图获取不同的锁时,这样做会导致死锁。
我发现 std::lock () 适合我的用例。但是 boost::shared_mutex 有等价的吗?
编辑:
关于有序锁定模式,它并不完全适合我的情况:
T1 lock (C,D,E)
T2 wants to lock (B,D), but can only obtain the lock for B
T1 spawns T3 which works on (B,C), it stuck when obtaining the lock for B
所以问题是当 T1 生成 T3 时需要对 B 进行额外的锁定,这破坏了有序锁定模式。我认为如果 T2 在 D 不可锁定时不为 B 持有锁,则可以解决此问题,本质上是 std::lock 所做的。
【问题讨论】:
-
如果您一次知道需要哪些锁——也就是说,在开始锁定之前,您已经掌握了整套锁——只需使用任何标准对锁进行排序并按该顺序锁定即可。只要所有线程都遵循相同的锁顺序,它们就永远不会死锁。 (这有时被称为“有序锁定模式”。)
-
@Nemo:这里是各种多锁算法的性能对比,包括排序算法:howardhinnant.github.io/dining_philosophers.html
标签: c++ multithreading boost boost-thread