使用互斥锁移动类的语义
Move semantics for class with mutex
我有一个类处理程序:
class Handler {
private:
std::mutex _mutex_list[4];
std:list<Person*> _waiting_list[4];
std::thread __runner_t;
public:
virtual void start();
};
我正在尝试在新线程中启动处理程序:
Handler* handler = new Handler();
std::thread(&Handler::start, handler);
问题是显然 std::thread 需要类的传输构造函数,我无法将其定义为默认值,因为无法复制 std::mutex。
我定义了一个自定义复制构造函数,它只复制列表,但重新初始化互斥数组和线程。
在这里:
Handler(const Handler& other) :
_mutex_list(), _waiting_list(other._waiting_list), _runner_t() {};
当然不起作用,因为编译器要求传递构造函数。
我不确定如何实现相同的转移。
这是一个正确的解决方案吗?有没有更好的解决方案?
感谢帮助。
没有transfer
构造函数,有移动构造函数。您的代码存在逻辑问题 - 您正在创建一个线程并将您的对象复制到其中,但该对象拥有线程,这是错误的。
我会说,如果你有一个拥有线程的对象,运行这个线程应该是它自己的函数,比如:
class Handler {
...
void start() {
__runner_t = std::thread(&thread_func, this);
}
};
您遇到的技术编译错误虽然可以解决,但突出了逻辑问题。
相关文章:
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- 可以使用移动语义更改或改进此C++代码吗?
- c++在使用指针时移动语义
- 使用移动和复制语义时函数匹配如何工作?
- 移动语义和深层/浅层复制之间有什么关系?
- 了解构造函数在移动、复制、赋值语义中的行为
- std::unique_lock移动语义
- 移动语义和运算符 + 重载
- C++ 移动语义是否在任何情况下都能节省资源?
- 移动语义在这里如何工作?
- 使用移动语义:右值引用作为方法参数
- 在C++中使用移动语义的正确方法是什么?
- 移动语义 c++ 单链表
- C++:使用整数移动语义
- 当变量和参数名称匹配时,移动语义构造失败
- 在 C++11 中移动语义
- 方法冗余移动调用的移动语义
- 视觉理解移动C++标准的语义
- 如何通过move语义移动多个参数