スレッドセーフのためにプロビジョニングされたロックと一緒に、複数のスレッドによってアクセスされるデータを組み合わせる方法を検討してきました。私は、const-correctnessを維持しながらこれを行うことができないと思うところまで来ていると思います。
たとえば、次のクラスを見てください。
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;
これで、データとロックを組み合わせて、 としてマークmutex_
しmutable
ます。残念ながら、これは私が見る限り十分ではありません。使用すると、完全に正しくない関数から読み取り操作を実行するためにvector_with_lock
マークする必要があるためです ( const からである必要があります)。mutable
const
data_
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 が維持されるように、誰かがこれを見ることができますか? また、ここで間違った仮定をしましたか?