Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ STL中的boost::upgrade_到_unique_lock的等价物是什么?_C++_Multithreading_Stl_Boost Thread - Fatal编程技术网

C++ STL中的boost::upgrade_到_unique_lock的等价物是什么?

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

我试图用C++11中的STL函数替换boost函数。 我的多线程应用程序中有一个写函数

首先,函数验证数据。下一步,写信给它。 有两种锁,如下所述:

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功能的功能吗? 在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();
#包括
#包括
使用名称空间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>读卡器锁,这在原始代码中不会发生。