我是C++ 11和使用线程的新手。我遇到了一个不可能复制互斥和条件变量对象的场景。密码是这样的..。
class producer {
public:
producer(mutex m, condition_variable cv)
{
mut = m; // ERROR
cvar = cv; // ERROR
}
private:
mutex mut;
condition_variable cvar;
}当试图复制构造函数中的变量时,它会给出错误。似乎复制构造函数设置为删除互斥和cv。
有办法克服这一点吗?我想要一个生产者和消费者类,然后从主函数中传递mutex & cv。
所以基本上主要功能的调用应该看起来像..。
int main ()
{
mutex m;
condition_variable cv;
//Initialize mutex & cv
producer prod(m, cv);
}发布于 2019-05-19 02:18:45
不,这不可能。在C++中添加了功能以启用此功能(不复制)。
如果您考虑实现,您是否正在更改某种内核对象?会不会是一样的。可能不会。这是故意的。
发布于 2019-05-19 02:24:18
您需要存储指向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拥有很强的所有权,但是这比输入更快。
发布于 2019-05-19 03:30:11
这是不可能的。
复制互斥是什么意思?它应该做些什么?
假设你在等待一个互斥体A,有些人将互斥体A复制到互斥体B。你还在等待A还是B?还是两个人的?不是的。您仍然应该等待A,因此其他互斥B不能是A的副本,因此复制将被删除。
移动操作是有意义的,但是由于互斥变量是静态分配的,如果不改变它们的地址,移动它们是不可能的--这对等待互斥的人来说是一场噩梦。因此,移动操作也被删除。
同样的条件也适用于条件变量。
要克服这些问题,可以使用指向互斥变量和条件变量的指针。比方说,如果您想要一个简单的设计,可以将它们存储为std::shared_ptr<std::mutex>和std::shared_ptr<std::condition_variable>。
https://stackoverflow.com/questions/56204230
复制相似问题