如何用"upgrade_to_unique_lock"进行"try_lock"
How to do a "try_lock" with an "upgrade_to_unique_lock"
我想在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_lock
和std::defer_lock
。我相信你也可以从boost中获得这个功能(虽然不是积极的)。
这个例程原子地独占地锁定中心节点,并共享锁定相邻节点。它会阻塞,直到获得所有的锁。它不会阻止它的邻居做同样的事情。也就是说,使用std::lock
将确保没有死锁。
我很不确定这实际上是在解决你想做的事情。但也许它会帮助我们找到一个答案…
- 通过递归进行因子分解
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 使用libgit2、c++进行pull
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 如何使用模板函数的函数签名进行SFINAE
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 将模板化的类型与C++中的某些类/类型进行比较
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 如何对点云数据进行排序
- 从文本文件中读取时钟时间和事件时间并进行处理
- 对字符串进行位操作
- 是否可以使用winusb同时与多个相同的usb设备进行通信
- 是否可以对零模板参数进行模板专门化
- 对字符串进行排序时,在c++中处理sort()
- 试图对缓存进行跨步测试,但程序并没有结束
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- C++将目录中的所有文件与::filesystem进行比较