在C++的const function存取mutex

在 C++ 中寫 Multi-thread program的時候,為了 Thread-Safety 經常會在裡面塞 std::mutex

class ThreadSafe {
public:
    int get() const;
    void set(int value);

private:
    std::mutex _lock;
    int data;
};

但這時問題就來了, mutex::lock()/ mutex::unlock() 並不是 const member function,因此在 get() 中 lock mutex 的時候,想必會編譯失敗。

難道我們就得因此犧牲 const member function 的使用嗎?

其實 C++ 有一個鮮為人知的關鍵字 mutable ,他的功能是讓某個 field 可以在 const member function 中被修改:

class ThreadSafe {
public:
    int get() const;
    void set(int value);

private:
    mutable std::mutex _lock;
    int data;
};

如此一來就可以完美解決這個問題了~

P.S. 請不要隨意的濫用 mutable 關鍵字!容易導致程式未來難以維護或是定義與實做不一的問題 (容易被其他人或是未來的自己幹譙 XD)