私は、スレッド安全のためにプロビジョニングされたロックと並んで、複数のスレッドによってアクセスされるデータを組み合わせる方法を検討してきました。私はconst-correctnessを維持しながらこれを行うことはできないと思っています。私はmutable
としてmutex_
をマークし、データとロックを組み合わせてみてください。この中データを結合してロックしているとき、const-correctはできませんか?
template <typename TType, typename TMutex>
class basic_lockable_type
{
public:
typedef TMutex lock_type;
public:
template <typename... TArgs>
explicit basic_lockable_type(TArgs&&... args)
: TType(std::forward<TArgs...>(args)...) {}
TType& data() { return data_; }
const TType& data() const { return data_; }
void lock() { mutex_.lock(); }
void unlock() { mutex_.unlock(); }
private:
TType data_;
mutable TMutex mutex_;
};
typedef basic_lockable_type<std::vector<int>, std::mutex> vector_with_lock;
:
は、例えば以下のクラスを取ります。残念ながら、使用時には、完全には正しくないconst
関数から読み取る操作を実行するためにmutable
とマークする必要があるため、これは十分ではありません(data_
はconstからのmutable
である必要があります) 。
void print_values() const
{
std::lock_guard<vector_with_lock> lock(values_);
for(const int val : values_)
{
std::cout << val << std::endl;
}
}
vector_with_lock values_;
とにかくconst-correctnessが維持され、データとロックが結合されるような人は誰でも見ることができますか?また、私はここで誤った仮定をしていますか?
'lock'と' unlock'をconstにしますか? (また、それはすべきではない 'のstd :: lock_guardあなたがそれを使用しない場合のために、新たなロック可能な作ったのはなぜ?'?) –
更新 'マーキング、もちろんR.MartinhoFernandes @ – Graeme
をlock_guard'これらconstは、変更不可能な 'vector_with_lock'インスタンスコール' lock'と 'unlock'を許可します、はい?あなたは、私が答え – Graeme