我一直在尋找合併一段數據的方法,這些數據將被多個線程訪問,並與爲線程安全提供的鎖一起使用。我認爲我已經達到了一個我認爲不可能做到這一點的地步,同時保持了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
將不得不被標記爲mutable
,以便從const
函數執行讀取操作,該函數不完全正確(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'?爲什麼你會新建一個可鎖定的,如果你不打算使用它?) –
更新'lock_guard' – Graeme
@ R.MartinhoFernandes當然,標記這些const會允許一個不可變的'vector_with_lock'實例調用'lock'和'unlock',是嗎? – Graeme