繁体   English   中英

std :: lock()是否等同于boost :: shared_mutex?

[英]std::lock() equivalent for boost::shared_mutex?

我有许多对象,每个对象都与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可以做到的。

您可以使用std::lock (或等效的boost::lock ,统称为“锁定功能”)来执行共享所有权锁定和排他锁定,具体取决于您传递的锁定内容-任何可锁定的功能都Lockable使用。 例如,如果您要在互斥模式下锁定两个std::mutex / boost::mutex A, Bboost::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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM