2014-11-14 44 views
3

我有一个在两个并发线程之间共享的资源。该资源包含两个线程需要读取和写入的向量。因此,我通过互斥体访问该向量。迄今为止,资源共享运作良好,没有任何问题。复制构造函数相关的编译器错误

但是,当我尝试按如下方式为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而不通过lock guard。但我想避免这种可能性。

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

如果您将互斥锁声明为“可变”,该怎么办? – PaulMcKenzie

+0

@PaulMcKenzie不知道这是一个选项 –

+0

请检查您的代码是否传递*副本*互斥量与传递*引用*。处理引用时,请记住方法的任何“常量”。 –

回答

6

这是因为getVec()const方法,但vecMutexmutable。您应该使getVec()非const,以便它可以修改(获取)互斥锁,或者使互斥锁mutable可以通过const方法获取。我可能会做后者。

+0

谢谢我在GCC中得到了同样的错误:没有匹配函数调用'std :: lock_guard :: lock_guard(const std :: mutex&) – ShitalShah

4

快速的答案是使vecMutex可变。

mutable std::mutex vecMutex; 

您的代码还有另一个非标准问题。您的默认和复制构造函数被错误地声明。它应该是这样的:

sharedResource(){} 
sharedResource(const sharedResource &other) 
{ 
    vec = other.GetVec(); 
} 

您还缺少赋值运算符。

+0

这是否解释错误文本?我试图看看这是如何相关的。 – ThomasMcLeod

+0

换句话说,所谓的'lock_guard'拷贝构造函数? – ThomasMcLeod

+0

@ThomasMcLeod - 由OP发布的代码有两个错误,一个是他注意到的,另一个显然是他的编译器让他放弃了。正如我在答复的第二部分中指出的那样。 – PaulMcKenzie