我有许多对象,每个对象都与一个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所做的。
发布于 2014-01-13 18:59:48
您可以使用std::lock
(或等效的boost::lock
,统称为“锁函数”)执行共享所有权锁定和独占锁定,这取决于您传入的要锁定的内容--任何Lockable
都可以工作。例如,如果您想在独占模式下锁定两个std::mutex
/boost::mutex
的A, B
和boost::shared_mutex SM
,只需将这三个锁传递给std::lock
。
std::lock(A, B, SM);
如果您想在共享所有权模式下锁定SM
,您可以为它创建一个未锁定的boost::shared_lock
,并将其传递给锁定函数:
boost::shared_lock<boost::shared_mutex> bsl{SM, boost::defer_lock};
std::lock(A, B, bsl);
在一个与您的问题风格偏好无关的注意事项上--我更喜欢构造RAII锁以传递到std::lock
,这样我就不会搞砸解锁,所以我实际上会写:
auto alk = boost::make_unique_lock(A, std::defer_lock);
auto blk = boost::make_unique_lock(B, std::defer_lock);
// boost::make_shared_lock(), where are you?!?
boost::shared_lock<boost::shared_mutex> bsl{SM, boost::defer_lock};
std::lock(alk, blk, bsl);
https://stackoverflow.com/questions/21104958
复制