我想在班上使用std::mutex
,并注意到它不可复制。我在这里的图书馆底层,所以这种行为似乎是一个糟糕的主意。
我在std::lock_guard
上使用了std::mutex
,但似乎并不是shared_lock_guard
,最好只提供写锁定行为。这是实施自己的疏忽还是微不足道的事情?
答案 0 :(得分:1)
使用 C++14
您可以使用std::shared_lock和std::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。