我想在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个异步请求。
答案 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_lock
和std::defer_lock
。我相信你也可以通过boost来获得这个功能(虽然不是正面的)。
此例程以原子方式独占锁定中心,并共享锁定邻居。它会阻塞,直到它可以获得所有锁定。它并不妨碍其邻居做同样的事情。也就是说,使用std::lock
将确保没有死锁。
我非常不确定这实际上是在解决你想要做的事情。但也许这会有助于找到答案......