繁体   English   中英

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 并且想知道是否有等效的标准库 class?

shared_mutex上的 cppreference :

共享互斥锁不支持从共享所有权模式直接转换到唯一所有权模式:必须先使用 unlock_shared() 放弃共享锁,然后才能使用 lock() 获得独占所有权。 boost::upgrade_mutex 可用于此目的。

所以不行。

Howard Hinnant 提出的shared_mutex的最初提案N3568还包含一个upgrade_mutex提案,它正好填补了这个空白。 然而,并发小组反对将upgrade_mutex引入 C++14。 因此,霍华德编写了N3569 ,其中仅包含shared_mutex 该提案被 C++17 接受。

霍华德在此答案中给出了删除的更详细原因,并表示他不会投入时间和精力来使upgrade_mutex标准化。 可悲的是,它可能永远不会被标准化。

通常我会建议为此使用 Boost。 由于您明确想要替换 Boost,因此没有太多选择。

一种是使用目标操作系统提供的方法,这种方法是不可移植的,可能不是您想要的。 如果您的<mutex>实现提供std::mutex::native_handle() ,这将变得更容易。

您也可以编写自己的解决方案,查看 Howard 的upgrade_mutex参考实现 请注意,您不能将其与 std::lib 直接结合,因为 N3568 会向std::unique_lock添加七个构造函数,而用户代码显然无法做到这一点。 因此,您需要将<mutex>的适当许可实现克隆到您自己的命名空间中,将其与参考实现结合起来,然后将这些构造函数添加到您实际需要的unique_lock中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM