【发布时间】:2012-11-20 10:51:16
【问题描述】:
我一直在寻找方法来组合一条数据,这些数据将由多个线程访问,以及为线程安全而提供的锁。我想我已经到了一个地步,我认为不可能在保持 const 正确性的同时做到这一点。
以下面的类为例:
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 必须标记为mutable,以便从不完全正确的const 函数执行读取操作(@987654327 @ 应该是来自 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 正确性?另外,我在这里做了什么不正确的假设吗?
【问题讨论】:
-
将
lock和unlock设为常量? (另外,它不应该是std::lock_guard<vector_with_lock>吗?如果你不打算使用它,你为什么要制作一个新的可锁定的?) -
@R.MartinhoFernandes 当然,标记这些 const 将允许不可变的
vector_with_lock实例调用lock和unlock,是吗? -
@R.MartinhoFernandes 如果您提供的答案解释了将 const 限定符添加到
lock和unlock我可以接受这个答案 -
我发布了一个答案,建议采用更封装的设计。
标签: c++ multithreading c++11 thread-safety mutable