工作情況:爲什麼我們可以鎖定一個const對象中定義的互斥鎖?
template<typename T>
class threadsafe_queue
{
private:
mutable std::mutex mut;
std::queue<T> data_queue;
public:
threadsafe_queue()
{}
threadsafe_queue(const threadsafe_queue& other)
{
std::lock_guard<std::mutex> lk(other.mut);
data_queue=other.data_queue;
}
};
情況下應該會失敗:注意沒有mutable
上std::mutex mut;
template<typename T>
class threadsafe_queue
{
private:
std::mutex mut;
std::queue<T> data_queue;
public:
threadsafe_queue()
{}
threadsafe_queue(const threadsafe_queue& other)
{
std::lock_guard<std::mutex> lk(other.mut);
data_queue=other.data_queue;
}
};
我曾嘗試上面列出的這兩種情況下,他們編譯沒有問題。我在內部假設lock_guard調用mutex :: lock函數,它本身不是一個const函數。
問題>爲什麼我們可以在複製構造函數中鎖定const對象的互斥量?
肯定'可變'是這裏的關鍵? –
@OliverCharlesworth:看看第二個版本,'mutable'關鍵字消失了。提問者報告說該版本也起作用。 – user2357112
@ user2357112 - 它並不真正工作,雖然:http://ideone.com/2MVs0O –