私のクラスでstd::mutex
を使いたかったので、コピーできないことに気付きました。私はここの図書館の一番下にあります。だから、この行動をとるのはひどい考えです。`shared_lock_guard`はありますか?もしそうでなければ、どのように見えますか?
私はstd::mutex
でstd::lock_guard
を使用しましたが、書き込みロックのみの動作を提供することが好ましいshared_lock_guard
はありません。これは自分自身を実装するための見落としですか?
私のクラスでstd::mutex
を使いたかったので、コピーできないことに気付きました。私はここの図書館の一番下にあります。だから、この行動をとるのはひどい考えです。`shared_lock_guard`はありますか?もしそうでなければ、どのように見えますか?
私はstd::mutex
でstd::lock_guard
を使用しましたが、書き込みロックのみの動作を提供することが好ましいshared_lock_guard
はありません。これは自分自身を実装するための見落としですか?
あなたは/書き込みロックを読んで実装する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);
}
}
OPが実際にRWロックを要求しているかどうかはわかりません。 –
@πάνταῥεῖ多分。しかし、私は彼が他の何かを意味すると思うことはできません。 – Galik
これで右にあなたの勇気のように見えます。 –
それはまだC++標準の一部ではないのですが、あなたはブーストで実装例を見つけることができます。
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。
多分あなたはこれが必要です:[std :: shared_lock](http://en.cppreference.com/w/cpp/thread/shared_lock) – Galik
これは深刻なXY問題/設計上の欠陥のようです。私はクラスレベルでミューテックスを持っています。 –
"*私はここで私のライブラリの一番下にありますので、この動作をするのはひどい考えです。*"一般に、ミューテックスはライブラリの最下位レベルに生きてはいけません。少なくとも、あなたが提案している方法ではない。ユーティリティクラスへのアクセスをmutex-lockしようとしているようです。それは一般的に悪い考えです。 –