【发布时间】:2014-08-11 15:39:16
【问题描述】:
新的 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();
理想情况下,m.unlock_shared(); m.lock(); 可以替换为类似 m.upgrade_to_exclusive();(或类似 boost::.upgrade_to_unique_lock())的内容。
In a similar question but for Boost's shared_mutexDave S 提到
如果不先释放共享锁,就不可能从共享锁转换为唯一锁,或从共享锁转换为可升级锁。
我不确定这是否适用于 std::shared_mutex,尽管我怀疑它确实如此。
我会对基于 std::atomic/condition_variable 或 GCC 事务内存的合理解决方法感到满意。
编辑:霍华德的回答解决了我的问题。他的proposal N3427 包含对实现互斥升级的机制的很好描述。我仍然欢迎基于 std::atomic/condition_variable 或 GCC 事务内存的变通方法。
【问题讨论】:
-
似乎 std::shared_mutex 不能,但boost::shared_mutex can!
标签: c++ multithreading c++11 c++14