STL 中 boost::upgrade_to_unique_lock 的等价物是啥?
Posted
技术标签:
【中文标题】STL 中 boost::upgrade_to_unique_lock 的等价物是啥?【英文标题】:What is the equivalent of boost::upgrade_to_unique_lock in STL?STL 中 boost::upgrade_to_unique_lock 的等价物是什么? 【发布时间】:2015-05-18 10:00:30 【问题描述】:我正在尝试用 C++11 中的 STL 功能替换增强功能。 我的多线程应用程序中有一个写函数。
首先,函数验证数据。接下来,写入它。 有两种锁,如下所述:
class Data
mutable boost::mutex mut;
void Data::Write()
boost::upgrade_lock<boost::shared_mutex> ulock(mut);
// ... Verification statements
boost::upgrade_to_unique_lock<boost::shared_mutex> lock(ulock);
// ... Writing statements
;
我是增强功能的新手。您能否解释一下它的作用以及我如何使用 STL 功能实现该功能?
【问题讨论】:
【参考方案1】:C++11 根本不提供共享锁。 C++14 可以,但不允许将它们升级为独占锁;为此,您需要第二个互斥锁,例如:
mutable std::shared_timed_mutex read_mutex;
std::mutex write_mutex;
void Write()
std::shared_lock read_lock(read_mutex);
// ... Verification statements
std::lock_guard write_lock(write_mutex);
// ... Writing statements
您只需要注意在已经持有读锁的同时获取写锁,以避免死锁。如果您有一个可行的 Boost 解决方案,最好坚持使用它,直到标准库提供等效功能。
【讨论】:
继续使用 boost 对我来说不是一个选择。我必须删除它。我试图测试你的解决方案。但无法将 shared_timed_mutex 放入代码中。它仅在 C++14 中添加。我的是 C++ 11 :( @Neo:如果你不能使用 C++14,你不能使用 Boost,那么你就不能使用共享锁(除非你忘记了 C++ 库并直接进入本机 API)。这三个限制之一将不得不取消。 重新添加提升。 :-) 它混合得很好。 我认为建议的解决方案并不等同。reader_lock
可以被获取,而write_lock
被另一个线程持有,这在原始代码中不会发生。
这是不正确的。不能保证写互斥锁中发生的事情会在读互斥锁中看到。所以基本上它与完全没有读锁的代码效果相同。这是数据竞赛【参考方案2】:
在 C++ 线程中你会得到:
#include <thread>
#include <mutex>
using namespace std;
mutex mu;
// lock_guard: acquire the mutex mu and lock it. when the lock_guard object goes out of scope, mutex is unlocked.
lock_guard<mutex> lock(mu);
// more flexible than the lock_guard
// http://en.cppreference.com/w/cpp/thread/unique_lock
unique_lock<mutex> ulock(mu);
ulock.unlock();
ulock.lock();
【讨论】:
C++11 就是这种情况。但问题是关于 C++14 中引入的共享锁。 感谢您的快速回复。但我认为std::lock_guard 可以代替boost::unique_lock。但在这种情况下,我正在寻找 upgrade_lock 和 upgrade_to_unique_lock 的替代品。我认为当他们意味着升级时,可以在等待关键部分时获得更多偏好(如果我错了,请纠正我)。 STL中有没有类似的概念? @Neo:“升级”意味着将共享锁转换为排他锁。据我所知,标准库还不支持(从 C++14 开始)。如果您需要该功能,我想您现在必须坚持使用 Boost。 @MikeSeymour,对不起,我忘了提到我感兴趣的 C++ 版本!我的项目是 C++11。所以我更喜欢 C++11 中的解决方案以上是关于STL 中 boost::upgrade_to_unique_lock 的等价物是啥?的主要内容,如果未能解决你的问题,请参考以下文章