gpt4 book ai didi

c++ - 复制构造函数相关的编译错误

转载 作者:太空狗 更新时间:2023-10-29 19:52:22 24 4
gpt4 key购买 nike

我有两个并发线程共享的资源。该资源包含两个线程都需要读取和写入的 vector 。因此,我通过互斥锁来独占访问 vector 。到目前为止一切顺利,资源共享运行良好,没有任何问题。

但是,当我尝试如下为 sharedResource 编写复制构造函数时,问题就开始了。

class sharedResource{
public:
sharedResource(){}
sharedResource(const sharedResource &other) {
vec = other.GetVec();
}
std::vector<int> GetVec() const {
std::lock_guard<std::mutex> lock(vecMutex); // Gives error
return vec;
}

private:
std::vector<int> vec;
std::mutex vecMutex;
};

int main()
{
sharedResource bacon1;
sharedResource bacon2 = bacon1;
return 0;
}

对于这段代码,我得到错误

error C2664: 'std::lock_guard<std::mutex>::lock_guard(const std::lock_guard<std::mutex> &)' : cannot convert argument 1 from 'const std::mutex' to 'std::mutex &'

能否请您解释一下为什么我会收到错误消息,以及是否有一种方法可以在不收到编译器错误的情况下使用互斥锁。

如果一切都失败了,我将创建一个线程不安全的 GetVec2 成员函数,它将返回 vec 而不通过锁守卫。但我想避免这种情况。

std::vector<int> GetVec2() const {
return vec;
}

最佳答案

发生这种情况是因为 getVec() 是一个 const 方法,但 vecMutex 不是 mutable。您应该将 getVec() 设置为非 const,以便它可以修改(获取)互斥量,或者将互斥量设置为 mutable,以便它也可以通过 const 方法获取。我可能会选择后者。

关于c++ - 复制构造函数相关的编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26921534/

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