我有一个不可复制的类(即复制构造函数和赋值运算符被标记为'delete').我想将它们保存在std :: vector中.
它是一个RAII类,所以简单地存储指针或引用它不是我想要的.
我对新的初始化列表和移动构造函数的了解有限,这可能吗?
C++ std::mutex没有移动构造函数.这是有充分理由的.基本上,移动构造函数本身通常不是线程安全的,并且互斥体的全部意义在于多个线程将尝试同时访问它.
不幸的是,互斥不能直接放入容器中.容器需要能够安全地移动其内容,而您不能使用互斥锁.
简单的方法是用一个单独的互斥锁保护整个容器.但是假设我想要比那更精细的控制?如果我通过容器(例如:)实现数据库std::map,那么想要锁定单个记录的能力似乎是合理的,而不仅仅是整个数据库.
我想到的下一件事就是通过使用来破解问题std::unique_ptr.那会编译,但它并没有真正改变基本问题,是吗?移动存在问题的情况是,在使用该容器条目时,容器thread1更改会导致条目移动thread2.在这种情况下,thread2可能很容易最终持有一个被破坏的条目或智能指针.似乎无论如何,你最终都必须在做任何事情之前用互斥锁锁定整个容器.
似乎应该有一个已知的习惯用于做这些事情.
我正在寻找处理不可复制对象的最佳实践.
我有一个互斥类,显然不应该是可复制的.我添加了一个私有拷贝构造函数来强制执行.
这破坏了代码 - 有些地方只需要修复,但我有一个通用的问题,一个类,使用互斥量作为数据成员,或通过继承,被插入到容器中.
这通常发生在容器初始化期间,因此互斥锁尚未初始化,因此可以,但没有复制构造函数它不起作用.更改容器以包含指针是不可接受的.
有什么建议吗?