小编use*_*401的帖子

可以将std :: shared_timed_mutex上的共享锁升级为独占锁吗?

新的std :: shared_timed_mutex允许两种类型的锁:共享和独占.

如果有人持有共享锁,有没有办法以原子方式将它("升级它")交换为独占锁?换句话说,给定以下代码,我如何避免非原子性下降并重新锁定?

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();
Run Code Online (Sandbox Code Playgroud)

理想情况下,m.unlock_shared(); m.lock();可以用类似m.upgrade_to_exclusive();(或类似的东西boost::.upgrade_to_unique_lock())替换.

在一个类似的问题,但对于Boost的shared_mutex Dave S提及

在不释放共享锁的情况下,无法从共享锁转换为唯一锁,或共享锁转换为可升级锁.

我不确定这是否适用于std :: shared_mutex,尽管我怀疑它确实如此.

基于std :: atomic/condition_variable或GCC的事务内存,我会对合理的解决方法感到满意.

编辑:霍华德的回答解决了我的问题.他的提议N3427包含了实现互斥升级的机制的很好的描述.我仍然欢迎基于std :: atomic/condition_variable或GCC事务内存的解决方法.

c++ multithreading c++11 c++14

16
推荐指数
1
解决办法
3593
查看次数

标签 统计

c++ ×1

c++11 ×1

c++14 ×1

multithreading ×1