У меня есть рабочий поток, похожий на следующий код. В begin_work
он проверяет, выполняется ли рабочий поток перед созданием нового рабочего потока. Однако begin_work
никогда не создаст следующий рабочий поток при выходе из текущего потока, пока я не вызову end_work
.
Я попытался вызвать detach
в конце потока, и он отлично работает. Безопасно ли вызывать detach
в конце потока? Или как я могу безопасно создать следующий рабочий поток, не вызывая end_work
перед вызовом begin_work
?
class thread_worker {
private:
std::thread worker;
// ... other menbers
public:
thread_worker() {};
~thread_worker() { end_work(); };
void begin_work() {
if (!worker.joinable()) {
worker = std::thread { &thread_worker::do_work, this };
}
}
void do_work() {
// ... access other members ...
if (exit not by notify) {
worker.detach(); // can I call detach?
}
}
void end_work() {
if (worker.joinable()) {
// notify worker to exit
worker.join();
}
}
};
Изменить:
Моя цель - вызвать begin_work
без блока. Если при выполнении есть один рабочий поток, то функция вернется напрямую или вернет ошибку is_working
. В противном случае легко создайте новый рабочий поток.
Поскольку std::thread::joinable()
всегда возвращает true
, пока не будет вызван join
или detach
. В результате будущий вызов begin_work
никогда не создаст новый рабочий поток, даже если текущий рабочий поток завершился.
Поэтому мне нужен механизм автоматического отсоединения в конце потока.
std::thread
не является потокобезопасным, почему бы просто не вызватьend_work()
в началеbegin_work
? - person Alan Birtles   schedule 17.07.2020begin_work
неет сохранять текущий рабочий поток при его запуске.end_work
вызывается только тогда, когда пользователь выходит из приложения. - person Kai   schedule 17.07.2020std::thread::join
не завершает текущий рабочий поток. Он будет держать его и ждать, пока он не закончится. - person Daniel Langr   schedule 17.07.2020begin_work
создает новый поток только тогда, когда предыдущий поток закрывается? Итак, как можно создать дополнительные потоки? Если вы намерены вызватьend_work
в конце выхода из приложения, вы, вероятно, захотите, чтобы несколько потоков выполнялись одновременно. - person P.P   schedule 17.07.2020thread_worker
. Какова его цель? Как его предполагается использовать? - person Daniel Langr   schedule 17.07.2020end_work
он уведомляет текущий поток о выходе перед вызовомjoin()
, текущий рабочий поток будет немедленно прерван при получении уведомления о выходе. Если я вызовуbegin_work
несколько раз, можно будет выполнить только последний рабочий поток. - person Kai   schedule 17.07.2020w_done
нужно инициализировать доtrue
. В противном случае рабочая нить никогда не начнется. - person Kai   schedule 20.07.2020