提问人:Cassie Blosser 提问时间:7/28/2020 最后编辑:Cassie Blosser 更新时间:12/21/2021 访问量:456
std 库等同于 boost::upgrade_lock 和 boost::upgrade_to_unique_lock
std library equivalent to boost::upgrade_lock and boost::upgrade_to_unique_lock
问:
我刚刚给出了使用 std 库删除 boost 依赖项的任务。我遇到过 upgrade_lock 和 upgrade_to_unique_lock,想知道是否有等效的 std 库类?
答:
从 cppreference 开始:shared_mutex
共享互斥锁不支持从共享所有权模式直接过渡到唯一所有权模式:必须先使用 unlock_shared() 放弃共享锁,然后才能使用 lock() 获得独占所有权。boost::upgrade_mutex 可用于此目的。
所以不。
霍华德·辛南特(Howard Hinnant)提出的最初提案N3568也包含一项提案,该提案恰好填补了这一空白。
然而,并发子组反对引入 C++14。
因此,霍华德写了N3569,其中只包括.该提案被C++17所接受。shared_mutex
upgrade_mutex
upgrade_mutex
shared_mutex
霍华德在这个答案中给出了更详细的删除原因,并表示他不会投入时间和精力来获得标准化。可悲的是,它永远不会被标准化。upgrade_mutex
通常我会建议为此使用 Boost。由于您明确想要替换 Boost,因此没有太多选择。
一种是使用目标操作系统提供的方法,这些方法不可移植,可能不是您想要的。如果您的实现提供 std::mutex::native_handle(),
这将变得更加容易。<mutex>
你也可以编写自己的解决方案,看看 Howard 的 upgrade_mutex
参考实现。请注意,您不能将其与 std::lib 直接组合在一起,因为 N3568 将添加七个用户代码显然无法执行的构造函数。因此,您需要将适当许可的实现克隆到您自己的命名空间中,将其与引用实现组合,然后将这些构造函数添加到您实际需要的构造函数中。std::unique_lock
<mutex>
unique_lock
评论
shared_lock
unique_lock