C++ 复制构造函数相关的编译器错误
我有一个在两个并发线程之间共享的资源。该资源包含两个线程都需要读取和写入的向量。因此,我通过互斥访问向量。到目前为止,很好地实现了资源共享,没有任何问题 但是,当我尝试为sharedResource编写一个副本构造函数时,问题就开始了,如下所示C++ 复制构造函数相关的编译器错误,c++,multithreading,c++11,mutex,stdthread,C++,Multithreading,C++11,Mutex,Stdthread,我有一个在两个并发线程之间共享的资源。该资源包含两个线程都需要读取和写入的向量。因此,我通过互斥访问向量。到目前为止,很好地实现了资源共享,没有任何问题 但是,当我尝试为sharedResource编写一个副本构造函数时,问题就开始了,如下所示 class sharedResource{ public: sharedResource(){} sharedResource(const sharedResource &other) { vec = other
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;
}
类共享资源{
公众:
sharedResource(){}
sharedResource(常量sharedResource和其他){
vec=other.GetVec();
}
std::vector GetVec()常量{
std::lock_guard lock(vecMutex);//给出错误
返回向量;
}
私人:
std::vec;
std::互斥向量互斥;
};
int main()
{
共享资源bacon1;
sharedResource bacon2=bacon1;
返回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 &'
错误C2664:'std::lock\u guard::lock\u guard(const std::lock\u guard&'):无法将参数1从'const std::mutex'转换为'std::mutex&'
你能解释一下为什么我会出现错误,以及是否有一种方法可以在不出现编译器错误的情况下使用互斥
如果所有其他操作都失败,我将创建一个线程不安全的GetVec2成员函数,该函数将返回vec,而不经过锁保护。但我想避免这种可能性
std::vector<int> GetVec2() const {
return vec;
}
std::vector GetVec2()常量{
返回向量;
}
发生这种情况是因为getVec()
是一种const
方法,但vecutex
不是可变的。您应该将getVec()
设置为非常量,以便它可以修改(获取)互斥体,或者将互斥体设置为可变的
,以便它也可以通过常量方法获取。我可能会做后者。快速的答案是使vecutex
可变
mutable std::mutex vecMutex;
您的代码还有另一个非标准问题。默认构造函数和复制构造函数的声明不正确。应该是这样的:
sharedResource(){}
sharedResource(const sharedResource &other)
{
vec = other.GetVec();
}
您还缺少赋值运算符 如果您将互斥体声明为mutable
,该怎么办?@PaulMcKenzie不知道这是一个选项。请查看您的代码以传递互斥体副本,而不是传递引用。在处理引用时,请记住方法的任何常量。与您的问题无关,但您可能希望研究方法。很可能,您还想在移动或销毁对象之前锁定此互斥锁。@user3670482-您缺少赋值运算符。但这里似乎有些奇怪——互斥是一个非静态成员变量。它将根据sharedResource
的每个实例而有所不同。因此,在一个实例中锁定互斥锁对另一个实例没有影响。换句话说,我看不出你设计中的实用程序使用互斥锁。有人指出我在这里没有看到的东西…这能解释错误文本吗?我在试着看看这有什么关系。换句话说,什么叫做lock\u guard
copy构造函数?@ThomasMcLeod——OP发布的代码有两个错误,一个是他注意到的,另一个显然是他的编译器让他逃脱了。这是我在回答的第二部分中指出的后一个错误。我花了几读才明白@PaulMcKenzie所说的是第二个错误。我一直在看函数的主体,忽略了重要的部分。为了其他人的利益,他说如果你在类中内联定义函数,那么你就不需要sharedResource::
。但是,如果您将它们放在类定义之外,那么您需要将它们称为sharedResource::sharedResource()
和sharedResource::sharedResource(const sharedResource&other)
谢谢,我在GCC中遇到了同样的错误:调用'std::lock\u guard::lock\u guard(const std::mutex&')时没有匹配的函数