gpt4 book ai didi

c++ - std::lock() 相当于 boost::shared_mutex?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:24:42 28 4
gpt4 key购买 nike

我有许多对象,每个对象都与一个 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 s A, Bboost::shared_mutex SM在独占模式下,您只需将三个传递给 std::lock :

std::lock(A, B, SM);

如果你想锁定 SM在共享所有权模式下,您可以创建一个未锁定的 boost::shared_lock为此,将 that 传递给锁定函数:

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);

关于c++ - std::lock() 相当于 boost::shared_mutex?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21104958/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com