std 库等同于 boost::upgrade_lock 和 boost::upgrade_to_unique_lock

std library equivalent to boost::upgrade_lock and boost::upgrade_to_unique_lock

提问人:Cassie Blosser 提问时间:7/28/2020 最后编辑:Cassie Blosser 更新时间:12/21/2021 访问量:456

问:

我刚刚给出了使用 std 库删除 boost 依赖项的任务。我遇到过 upgrade_lock 和 upgrade_to_unique_lock,想知道是否有等效的 std 库类?

C++ 提升 std

评论

0赞 ALX23z 7/28/2020
嗯。。。它真的有什么用吗?难道只是发布并制作新的工作吗?shared_lockunique_lock
0赞 Caleth 7/28/2020
@ALX23z 我认为它阻止了其他一些线程获得独占所有权,而您想从共享切换到独占,反之亦然
0赞 ALX23z 7/28/2020
@Caleth,但这很危险。因为尝试同时制作两个这样的会导致死锁。我想这就是标准回避此类功能的原因。
0赞 Lothar 4/28/2023
@ALX23z 我讨厌那些认为他们知道他们第一次来这里的概念的所有用例的人。它在实践中非常有用,几乎所有数据库都需要它来提高性能。

答:

0赞 ALX23z 7/28/2020 #1

从 cppreference 开始:shared_mutex

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

所以不。

3赞 Brandlingo 12/21/2021 #2

霍华德·辛南特(Howard Hinnant)提出的最初提案N3568也包含一项提案,该提案恰好填补了这一空白。 然而,并发子组反对引入 C++14。 因此,霍华德写了N3569,其中只包括.该提案被C++17所接受。shared_mutexupgrade_mutexupgrade_mutexshared_mutex

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

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

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

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

评论

1赞 jwd 10/7/2022
只是给其他找到这个(非常好的)答案的人的注意。有一些很好的可升级互斥锁的非实现,例如 folly::SharedMutex,值得考虑。std