C++ STL中的boost::upgrade_到_unique_lock的等价物是什么?
我试图用C++11中的STL函数替换boost函数。 我的多线程应用程序中有一个写函数 首先,函数验证数据。下一步,写信给它。 有两种锁,如下所述:C++ STL中的boost::upgrade_到_unique_lock的等价物是什么?,c++,multithreading,stl,boost-thread,C++,Multithreading,Stl,Boost Thread,我试图用C++11中的STL函数替换boost函数。 我的多线程应用程序中有一个写函数 首先,函数验证数据。下一步,写信给它。 有两种锁,如下所述: class Data { mutable boost::mutex mut; void Data::Write() { boost::upgrade_lock<boost::shared_mutex> ulock(mut); // ... Verification statemen
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
}
};
类数据
{
可变boost::互斥mut;
void Data::Write()
{
升级锁定锁定锁定(mut);
//…核查声明
boost::升级到唯一锁(ulock);
//…撰写声明
}
};
我是boost功能的新手。你能解释一下它的功能和如何实现STL功能的功能吗?
#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();
#包括
#包括
使用名称空间std;
互斥mu;
//lock_guard:获取互斥mu并将其锁定。当lock_guard对象超出范围时,互斥锁将被解锁。
锁和防护锁(mu);
//比锁护板更灵活
// http://en.cppreference.com/w/cpp/thread/unique_lock
唯一锁定锁定锁定(mu);
ulock.unlock();
ulock.lock();
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解决方案,那么最好坚持使用它,直到标准库提供了等效的功能。C++11就是这样。但是问题是关于C++14中引入的共享锁。感谢您的快速回复。但我认为std::lock\u-guard可以取代boost::unique\u-lock。但在这种情况下,我正在寻找升级锁和升级到唯一锁的替代品。我认为,当它们意味着升级时,可以在等待关键部分时获得更多偏好(如果我错了,请纠正我)。STL中是否有类似的概念?@Neo:“升级”意味着将共享锁转换为独占锁。据我所见,标准库还不支持这一点(从C++14开始)。如果你需要这个功能,我想你现在必须坚持Boost。“MikeSeymour,对不起,我忘了提到我感兴趣的C++版本!!对于我的项目,我是C++11。因此,我更喜欢C++11版本的解决方案。使用boost进行支付不是我的选择。我必须把它移走。我试着测试你的解决方案。但无法将共享\u定时\u互斥体放入代码中。它仅在C++14中添加。我的是C++ 11:(@ Ne:如果你不能使用C++ 14,并且不能使用Boost,那么你就不能使用共享锁(除非你忘记C++库,直接进入本机API)。这三个限制之一必须重新添加Booo..-)它混合得很好。我认为建议的解决方案不是等价的。当
write\u lock
由另一个线程持有时,可以获取code>读卡器锁,这在原始代码中不会发生。