Переместить семантику для класса с мьютексом - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть класс 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() {};

Конечно, не работает, потому что компилятор запрашивает конструктор переноса.

Я не уверен, как добиться того же дляперевод.

Это правильное решение?Есть ли лучшее решение?

Помощь приветствуется.

1 Ответ

0 голосов
/ 12 февраля 2019

Нет конструктора transfer, есть конструктор перемещения.В вашем коде есть логическая проблема - вы создаете поток и копируете в него свой объект, но этот объект владеет потоком, что просто неправильно.

Я бы сказал, если у вас есть объект, которыйвладеет потоком, запуск этого потока должен быть его собственной функцией, например:

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

Ошибки технической компиляции, которые вы имеете, хотя и разрешимы, выделяют логические проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...