gpt4 book ai didi

c++ - 为什么我们可以锁定在 const 对象中定义的互斥量?

转载 作者:太空宇宙 更新时间:2023-11-04 15:13:40 25 4
gpt4 key购买 nike

工作案例:

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;
}
};

应该失败的情况:注意 std::mutex mut; 上没有 mutable

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

问题>为什么我们可以在复制构造函数中锁定来自常量对象的互斥量?

最佳答案

第一个 示例可以编译,因为互斥锁被限定为 mutable .这意味着这个字段可以被修改、改变,而不认为包含的对象被认为已经改变。因此,从某种意义上说,互斥锁的状态不是“队列的一部分”。编译器允许 const 方法修改 mutable 成员。

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

关于c++ - 为什么我们可以锁定在 const 对象中定义的互斥量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43402777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com