【发布时间】:2014-11-14 01:31:04
【问题描述】:
我有一个在两个并发线程之间共享的资源。该资源包含两个线程都需要读取和写入的向量。因此,我通过互斥锁独占访问向量。到目前为止一切顺利,资源共享运行良好,没有任何问题。
但是,当我尝试如下为 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;
}
【问题讨论】:
-
如果将互斥体声明为
mutable会怎样? -
@PaulMcKenzie 不知道这是一个选项
-
请检查您的代码以传递互斥体的副本与传递引用。在处理引用时,请记住方法的任何
const-ness。 -
与您的问题无关,但您可能需要查看Rule of three (or five)。很有可能,您还想在对象被移动或销毁之前锁定此互斥体。
-
@user3670482 - 您缺少赋值运算符。但是这里有些奇怪——互斥锁是一个非静态成员变量。每个
sharedResource的实例都会有所不同。因此,将互斥锁锁定在一个实例中不会影响另一个实例。换句话说,我在您的设计中看不到互斥锁的实用程序。有人指出我在这里看不到的东西......
标签: c++ multithreading c++11 mutex stdthread