是否有`shared_lock_guard`,如果没有,它会是什么样子?

时间:2016-08-27 20:22:29

标签: c++ c++11 locking c++14 mutex

我想在班上使用std::mutex,并注意到它不可复制。我在这里的图书馆底层,所以这种行为似乎是一个糟糕的主意。

我在std::lock_guard上使用了std::mutex,但似乎并不是shared_lock_guard,最好只提供写锁定行为。这是实施自己的疏忽还是微不足道的事情?

2 个答案:

答案 0 :(得分:1)

使用 C++14 您可以使用std::shared_lockstd::unique_lock来实现读/写锁定:

class lockable
{
public:
    using mutex_type = std::shared_timed_mutex;
    using read_lock  = std::shared_lock<mutex_type>;
    using write_lock = std::unique_lock<mutex_type>;

private:
    mutable mutex_type mtx;

    int data = 0;

public:

    // returns a scoped lock that allows multiple
    // readers but excludes writers
    read_lock lock_for_reading() { return read_lock(mtx); }

    // returns a scoped lock that allows only
    // one writer and no one else
    write_lock lock_for_writing() { return write_lock(mtx); }

    int read_data() const { return data; }
    void write_data(int data) { this->data = data; }
};

int main()
{
    lockable obj;

    {
        // reading here
        auto lock = obj.lock_for_reading(); // scoped lock
        std::cout << obj.read_data() << '\n';
    }

    {
        // writing here
        auto lock = obj.lock_for_writing(); // scoped lock
        obj.write_data(7);
    }
}

注意:如果您有 C++17 ,则可以std::shared_mutex使用mutex_type

答案 1 :(得分:0)

它还不是C ++标准的一部分,但您可以在boost中找到实现示例。

template<typename SharedMutex>
class shared_lock_guard
{
private:
    SharedMutex& m;

public:
    typedef SharedMutex mutex_type;
    explicit shared_lock_guard(SharedMutex& m_):
        m(m_)
    {
        m.lock_shared();
    }
    shared_lock_guard(SharedMutex& m_,adopt_lock_t):
        m(m_)
    {}
    ~shared_lock_guard()
    {
        m.unlock_shared();
    }
};

它需要符合SharedMutex概念的互斥类;  std::shared_mutex是提议的C ++ 17标准的一部分,而且还有一段时间已经提升了boost::shared_mutex