如何使用“upgrade_to_unique_lock”执行“try_lock”

时间:2011-07-27 23:37:56

标签: c++ boost locks

我想在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时,它必须保证没有其他线程对其邻居有写锁,读锁是可以的。此外,不应该有一个菊花链的线程不必要地等待写锁(即,距离上的两个瓦片应该能够彼此独立地生成)。

我的实现取决于第三方算法,该算法根据查看相机的距离,根据需要异步请求页面。看起来它可以在任何特定的顺序中任意地为页面/图块组成16个异步请求。

1 个答案:

答案 0 :(得分:2)

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

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

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

我非常不确定这实际上是在解决你想要做的事情。但也许这会有助于找到答案......