gpt4 book ai didi

c++ - 将 boost::shared_lock 升级为独占锁

转载 作者:可可西里 更新时间:2023-11-01 18:28:45 26 4
gpt4 key购买 nike

谁能解释一下 boost::upgrade_lock 的正确用法。以下代码导致死锁

//Global
typedef boost::shared_mutex Mutex;
typedef boost::shared_lock<Mutex> ReadLock;
typedef boost::upgrade_lock<Mutex> UpgradeLock;
typedef boost::upgrade_to_unique_lock<Mutex> WriteLock;
Mutex sharedMutex;


//Multi threaded reader and writer
{
ReadLock read(sharedMutex);

for (int ii = 0; ii < vec.size(); ++ii) {
Element e = vec[ii];

if (e.needsUpdating()) {
UpgradeLock upgrade(sharedMutex);

WriteLock write(upgrade)

//Do stuff
}
}
}

如果我在升级前用 read.unlock() 解锁读锁,它不会死锁。不过好像没必要吧?

最佳答案

boost::shared_mutex 类(实现了 UpgradeLockable 概念)中,单个线程不应尝试同时获取共享锁和可升级(或唯一)锁。在任何时候,UpgradeLockable 都可以拥有 N 个共享锁(通过 lock_shared)和 1 个可升级锁(通过 lock_upgrade)。可升级锁可以请求它成为一个唯一锁,它会阻塞直到它可以成为独占持有者,这需要释放所有共享锁。如果不先释放共享锁,就不可能从共享锁转换为唯一锁,或者将共享锁转换为可升级锁。

注意,可升级锁不是独占的(可以持有其他共享锁)只是它有特殊的特权来增加它的强度。不幸的是,不允许同时使用多个可升级线程。

在您的情况下,同一个线程正在尝试使用 lock_sharedlock_upgrade,这将导致死锁。您可以按如下方式重写它,它不会死锁,但它仍然是所有读者的一个争论点,因为一次只有 1 个人持有升级锁。在这种情况下,根据您的其他功能,可能不需要 shared_mutex 的复杂性。但是,如果其他函数仍在获取共享锁,则以下将按您的预期执行。

//Multi threaded reader and writer
{
// Only 1 thread can pass this. Other shared locks are also valid
UpgradeLock read(sharedMutex);

for (int ii = 0; ii < vec.size(); ++ii) {
Element e = vec[ii];

if (e.needsUpdating()) {
// Blocks here until all shareds are released
WriteLock write(upgrade)

//Do stuff
}
}
}

关于c++ - 将 boost::shared_lock 升级为独占锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7378266/

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