为什么我们可以锁定const对象中定义的互斥锁?

时间:2017-04-13 22:38:31

标签: c++ c++11 synchronization const mutable

工作案例:

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函数。

问题&GT;为什么我们可以从复制构造函数中的const对象锁定互斥锁?

1 个答案:

答案 0 :(得分:7)

第一个示例进行编译,因为互斥锁有资格成为mutable。这意味着可以修改,变异此字段,而不会将包含对象视为已更改。因此,从某种意义上说,互斥体是&#39; state不是#34;队列的一部分&#34;。编译器允许const方法修改mutable成员。

第二个示例仅在您实际尝试实例化该类并使用该方法时才编译。如果你这样做,it fails。模板很神奇......