![](/img/trans.png)
[英]error: ‘shared_mutex’ is not a member of ‘std’ using ReaderLock = std::shared_lock<std::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, 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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.