什么是STL中的boost :: upgrade_to_unique_lock?

时间:2015-05-18 10:00:31

标签: c++ multithreading stl boost-thread

我正在尝试用C ++ 11中的STL functinoalities替换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
    }
};

我是推动功能的新手。您能否解释一下它的作用以及如何通过STL功能实现功能?

2 个答案:

答案 0 :(得分:2)

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解决方案,最好坚持下去,直到标准库提供相同的功能。

答案 1 :(得分:0)

在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();