2016-08-27 8 views
2

私のクラスでstd::mutexを使いたかったので、コピーできないことに気付きました。私はここの図書館の一番下にあります。だから、この行動をとるのはひどい考えです。`shared_lock_guard`はありますか?もしそうでなければ、どのように見えますか?

私はstd::mutexstd::lock_guardを使用しましたが、書き込みロックのみの動作を提供することが好ましいshared_lock_guardはありません。これは自分自身を実装するための見落としですか?

+0

多分あなたはこれが必要です:[std :: shared_lock](http://en.cppreference.com/w/cpp/thread/shared_lock) – Galik

+3

これは深刻なXY問題/設計上の欠陥のようです。私はクラスレベルでミューテックスを持っています。 –

+1

"*私はここで私のライブラリの一番下にありますので、この動作をするのはひどい考えです。*"一般に、ミューテックスはライブラリの最下位レベルに生きてはいけません。少なくとも、あなたが提案している方法ではない。ユーティリティクラスへのアクセスをmutex-lockしようとしているようです。それは一般的に悪い考えです。 –

答えて

0

あなたは/書き込みロックを読んで実装する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); 
    } 
} 
+0

OPが実際にRWロックを要求しているかどうかはわかりません。 –

+1

@πάνταῥεῖ多分。しかし、私は彼が他の何かを意味すると思うことはできません。 – Galik

+0

これで右にあなたの勇気のように見えます。 –

0

それはまだ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

関連する問題