使用互斥锁移动类的语义

Move semantics for class with mutex

本文关键字:语义 移动      更新时间:2023-10-16

我有一个类处理程序:

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);
    }
};

您遇到的技术编译错误虽然可以解决,但突出了逻辑问题。