Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 复制构造函数相关的编译器错误_C++_Multithreading_C++11_Mutex_Stdthread - Fatal编程技术网

C++ 复制构造函数相关的编译器错误

C++ 复制构造函数相关的编译器错误,c++,multithreading,c++11,mutex,stdthread,C++,Multithreading,C++11,Mutex,Stdthread,我有一个在两个并发线程之间共享的资源。该资源包含两个线程都需要读取和写入的向量。因此,我通过互斥访问向量。到目前为止,很好地实现了资源共享,没有任何问题 但是,当我尝试为sharedResource编写一个副本构造函数时,问题就开始了,如下所示 class sharedResource{ public: sharedResource(){} sharedResource(const sharedResource &other) { vec = other

我有一个在两个并发线程之间共享的资源。该资源包含两个线程都需要读取和写入的向量。因此,我通过互斥访问向量。到目前为止,很好地实现了资源共享,没有任何问题

但是,当我尝试为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;
}
类共享资源{
公众:
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&')时没有匹配的函数