gpt4 book ai didi

c++ - 如何用 "try_lock"做 "upgrade_to_unique_lock"

转载 作者:行者123 更新时间:2023-11-28 03:47:57 26 4
gpt4 key购买 nike

我想在不阻塞的情况下对 upgrade_lock 执行 upgrade_to_unique_lock,但粗略查看 Boost 源代码 (v1.46.1) 表明这是不可能的?我的方法错了吗?

我想首先获得一个资源的读锁,该资源也可能被其他线程持有以供读取。然后我想看看它是否可用于写入,如果不可用(其他共享读锁当前持有)稍后再做。

// No way to specify the boost::try_to_lock object
explicit upgrade_to_unique_lock(upgrade_lock<Mutex>& m_):
source(&m_),exclusive(move(*source))

我正在尝试使用异步中点位移算法以程序方式无缝生成地形图 block (页面)。这需要使用从周围的 4 个瓦片(北、西、东、南)获得的边缘来播种主题地形瓦片(中心)。边仅从存在的且已完全生成的邻居中收集。该实现应该一次阻塞在一个邻居瓦片上,而不是持有其他邻居的读锁,从而随时释放它们。当一个瓦片正在生成时,它必须保证没有其他线程对它的邻居有写锁,读锁是可以的。此外,不应有不必要地等待写锁的线程菊花链(即,相隔两 block 地 block 的地 block 应该能够彼此独立地生成)。

我的实现依赖于第三方算法,该算法根据与相机的观看距离根据需要异步请求页面。看起来它可以任意地对页面/磁贴进行多达 16 个异步请求,没有特定的顺序。

最佳答案

稻草人的回答。我很确定这不是一个有效的答案。但由于格式问题,我不能将其放在评论中。

为了生成中心图 block ,我很想做这样的事情:

tile::generate_center()
{
tile& north = ...;
tile& east = ...;
tile& south = ...;
tile& west = ...;
std::unique_lock<mutex_type> l0(mutex(), std::defer_lock);
shared_lock<mutex_type> ln(north.mutex(), std::defer_lock);
shared_lock<mutex_type> le(east.mutex(), std::defer_lock);
shared_lock<mutex_type> ls(south.mutex(), std::defer_lock);
shared_lock<mutex_type> lw(west.mutex(), std::defer_lock);
std::lock(l0, ln, le, ls, lw);
// This is exclusively locked, neighbors are share locked
// ...
}

这是使用 C++11 位,如 std::unique_lockstd::defer_lock。我相信您也可以从 boost 获得此功能(虽然不是积极的)。

此例程以原子方式独占锁定中心,并共享锁定邻居。它会阻塞,直到它可以获得所有锁。它不会阻止其邻居做同样的事情。也就是说,使用 std::lock 将确保没有死锁。

我非常不确定这是否真的解决了您正在尝试做的事情。但也许它会帮助找到答案......

关于c++ - 如何用 "try_lock"做 "upgrade_to_unique_lock",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6852524/

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