我有很多对象,每个对象都与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上额外锁定,这会打破有序的锁定模式。我认为如果当D不可锁定时T2不保持B的锁定,这个问题可以解决,基本上就是std :: lock的作用。
答案 0 :(得分:1)
您可以使用std::lock
(或等效boost::lock
,统称“锁定函数”)来执行共享所有权锁定以及独占锁定,具体取决于您传入的要锁定的内容 - 任何{ {1}}会奏效。例如,如果您想要以独占模式锁定两个Lockable
/ std::mutex
boost::mutex
和A, B
,则只需将三个传递给boost::shared_mutex SM
:< / p>
std::lock
如果您想要在共享所有权模式下锁定std::lock(A, B, SM);
,则可以为其创建解锁的SM
并将 传递给锁定函数:
boost::shared_lock
在与您的问题无关的注释 - 样式偏好 - 我更喜欢总是构造RAII锁以传递到boost::shared_lock<boost::shared_mutex> bsl{SM, boost::defer_lock};
std::lock(A, B, bsl);
所以我不能搞砸解锁,所以我实际上写道:
std::lock