c – std :: shared_timed_mutex上的共享锁可以升级到独占锁吗?

c – std :: shared_timed_mutex上的共享锁可以升级到独占锁吗?,第1张

概述新的std :: shared_timed_mutex允许两种类型的锁:shared和exclusive. 如果一个人持有一个共享锁,有没有什么办法将其交换(“升级”)到独占锁?换句话说,给出以下代码,如何避免非原子丢弃和重新锁定? std::shared_timed_mutex m; //Guards a std::vector.m.lock_shared();//Read from ve 新的std :: shared_timed_mutex允许两种类型的锁:shared和exclusive.

如果一个人持有一个共享锁,有没有什么办法将其交换(“升级”)到独占锁?换句话说,给出以下代码,如何避免非原子丢弃和重新锁定?

std::shared_timed_mutex m; //Guards a std::vector.m.lock_shared();//Read from vector. (Shared lock is sufficIEnt.)// ...//Now we want to write to the vector. We need an exclusive lock.m.unlock_shared();                   //     <---- Problem here: non-atomic! m.lock(); //Write to vector.// ...m.unlock();

理想情况下,m.unlock_shared(); M.LOCK();可以替换为m.upgrade_to_exclusive(); (或类似boost ::.upgrade_to_unique_lock()).

In a similar question but for Boost’s shared_mutex Dave S提到

It is impossible to convert from a shared lock to a unique lock,or a shared lock to an upgradeable lock without releasing the shared lock first.

我不知道这是否适用于std :: shared_mutex,虽然我怀疑它是.

基于std :: atomic / condition_variable或GCC的事务内存,我会很乐意合理解决.

编辑:霍华德的回答涉及我的问题.他的proposal N3427包含了一个实现互斥升级的机制的很好的描述.我仍然欢迎基于std :: atomic / condition_variable或GCC的事务内存的工作.

解决方法 不,它不能.该功能是以委员会名称upgrade_mutex和upgrade_lock提出的,但委员会选择拒绝该提案的那一部分.目前还没有任何正在进行的工作来重新推荐该功能.

编辑

为了回应user3761401的问题中的“从哪里走”编辑,我@R_419_7004@创建了一个部分执行的upgrade_mutex / upgrade_lock:

https://github.com/HowardHinnant/upgrade_mutex

随意使用这个.它在公共领域.它只进行了轻微测试,并没有完整的功能描述在N3427.具体来说,以下功能缺失:

>无法将unique_lock转换为shared_timed_lock.
>无法尝试或定时转换shared_timed_lock到unique_lock.
>无法尝试或定时将upgrade_lock转换为unique_lock.

话虽如此,我已经将这个功能包含在upgrade_mutex中,可以在这个低级别上以非常丑的方式访问(例如在main.cpp中).

N3427提及的其他锁定转换可用.

>从shared_timed_lock到upgrade_lock的尝试和定时转换.
>从upgrade_lock转换到shared_timed_lock.
>阻止从upgrade_lock转换为unique_lock.
>从unique_lock转换到upgrade_lock.

它已经被放在命名空间acme.把它放在你想要的任何命名空间

要求

编译器需要支持“rvalue-this”限定符和显式转换 *** 作符.

免责声明

该代码只进行了轻微的测试.如果您发现错误,我将不胜感激.

可以通过使用std :: atomic来优化upgrade_mutex.在这方面没有做出任何努力(这是一个困难而且容易出错的任务,花费比现在更多的时间).

总结

以上是内存溢出为你收集整理的c – std :: shared_timed_mutex上的共享锁可以升级到独占锁吗?全部内容,希望文章能够帮你解决c – std :: shared_timed_mutex上的共享锁可以升级到独占锁吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1247994.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存