如何用"upgrade_to_unique_lock"进行"try_lock"

How to do a "try_lock" with an "upgrade_to_unique_lock"

本文关键字:lock 进行 try unique to upgrade 何用      更新时间:2023-10-16

我想在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))

我正在尝试使用中点位移算法异步无缝地生成地形瓷砖(页面)。这需要在主题地形贴图(中心)中植入从周围4个贴图(北、西、东、南)获得的边缘。只从已经存在并且已经完全生成的邻居中收集边缘。实现应该一次阻塞一个邻居,而不是持有其他邻居的读锁,这样就可以随时生成读锁。当生成一个tile时,它必须保证没有其他线程对它的邻居有写锁,读锁是可以的。此外,不应该有一个等待写锁的菊花状线程链(也就是说,相隔很远的两个线程应该能够相互独立地生成)。

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

稻草人回答。我很确定这不是一个有效的答案。但是由于格式问题,我不能把它放在注释中。

为了生成中间的贴图,我想做这样的事情:

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将确保没有死锁。

我很不确定这实际上是在解决你想做的事情。但也许它会帮助我们找到一个答案…