对于boost :: shared_mutex,std :: lock()等价?

时间:2014-01-14 02:18:07

标签: c++ multithreading boost boost-thread

我有很多对象,每个对象都与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的作用。

1 个答案:

答案 0 :(得分:1)

您可以使用std::lock(或等效boost::lock,统称“锁定函数”)来执行共享所有权锁定以及独占锁定,具体取决于您传入的要锁定的内容 - 任何{ {1}}会奏效。例如,如果您想要以独占模式锁定两个Lockable / std::mutex boost::mutexA, 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