C ++ 11的新手,使用了线程。我遇到了无法复制互斥量和条件变量对象的情况。代码是这样的。。。
class producer {
public:
producer(mutex m, condition_variable cv)
{
mut = m; // ERROR
cvar = cv; // ERROR
}
private:
mutex mut;
condition_variable cvar;
}
当尝试在构造函数中复制变量时,出现错误。似乎将复制构造函数设置为针对互斥和cv删除。
有办法克服吗?我想要一个生产者和消费者类,然后从 main 函数传递互斥体和简历。
所以基本上从主函数的调用应该看起来像....
int main ()
{
mutex m;
condition_variable cv;
//Initialize mutex & cv
producer prod(m, cv);
}
答案 0 :(得分:2)
否,这是不可能的。在C ++中添加了功能以启用此功能(非复制)。
如果考虑实现,您是否正在更改某种内核对象?会一样吗?可能不会。这是设计使然。
答案 1 :(得分:1)
您将要存储对mutex
和condition_variable
的引用或指针。
class producer {
public:
producer(mutex & m, condition_variable & cv)
: _mut{m}
, _cvar{cv}
{
}
private:
mutex & mut;
condition_variable & cvar;
};
您可以使用std::shared_ptr
,因为这样可以使您的实例拥有mutex
和condition_variable
的强大所有权,但是键入速度更快。
答案 2 :(得分:1)
设计上不可能。
复制互斥量甚至意味着什么?应该怎么办?
假设您等待互斥锁A,并且某些主体将互斥锁A复制到互斥锁B。 您还在等待A还是B?还是对他们俩来说?否。您仍然应该等待A。 因此其他互斥锁B不能是A的副本。因此复制被删除。
移动操作很有意义,但是由于互斥量是静态分配的,因此在不更改其地址的情况下就不可能移动它们-这对于任何等待该互斥量的人来说都是一场噩梦。因此,移动操作也会被删除。
条件变量适用相同的条件。
要克服这些问题,可以使用互斥量和条件变量的指针。假设要进行简单设计,请将它们存储为std::shared_ptr<std::mutex>
和std::shared_ptr<std::condition_variable>
。