STL 中 boost::upgrade_to_unique_lock 的等价物是什么?

What is the equivalent of boost::upgrade_to_unique_lock in STL?

我正在尝试用 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 功能实现功能?

在 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 可以,但不允许将它们升级为独占锁;你需要第二个互斥锁,比如:

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 解决方案,最好坚持使用它,直到标准库提供等效功能。