使用互斥锁移动类的语义

问题描述 投票:0回答:1

我有一个类Handler:

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

当然不起作用,因为编译器要求传输构造函数。

我不确定如何实现相同的转移。

这是正确的解决方案吗?有更好的解决方案吗?

感谢帮助。

c++ multithreading mutex copy-constructor move-semantics
1个回答
1
投票

没有transfer构造函数,有移动构造函数。您的代码有一个逻辑问题 - 您正在创建一个线程,并且您正在将对象复制到其中,但此对象拥有该线程,这是错误的。

我会说,如果你有一个拥有线程的对象,运行这个线程应该是它自己的函数,如:

class Handler {
    ...
    void start() {
        __runner_t = std::thread(&thread_func, this);
    }
};

您可以解决的技术编译错误突出了逻辑问题。

© www.soinside.com 2019 - 2024. All rights reserved.