Как проверить состояние отдельного потока в C ++ 11? - PullRequest
0 голосов
/ 22 января 2020

Я пытался найти множество способов найти решение, но пока не нашел подходящего.

Я использую отдельный поток, потому что я не хочу, чтобы мой основной поток ожидал / блокировал запрос новый дочерний поток, поскольку у него много других важных дел.

Я создаю поток следующим образом:

std::thread rsync_t(&PreCompile::RunPreCompileThr, obj, arg1, arg2);
rsync_t.detach();

Теперь Цель состоит в том, чтобы периодически проверять, является ли этот отдельный поток active and running.

Я пытался сделать это в будущем / Promise и Asyn c, но для этого требуется .get (), что-то похожее на join (), что мне не нужно .

Любые предложения, чтобы сделать это?

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 22 января 2020

После того, как вы отсоединили поток, вы явно сказали: «Мне не нужно ждать окончания этой темы sh». Обычно это происходит потому, что поток никогда не завершается и продолжает работать до конца программы.

В любом случае std::thread не предоставляет механизма для опроса, чтобы увидеть, Нить закончилась без ожидания. Для этого вам нужно будет использовать альтернативный механизм, независимо от того, отсоединен поток или нет.

Один из вариантов - запустить поток с std::async(std::launch::async, func) и использовать возвращенное будущее, чтобы проверить, работает ли поток все еще. .

auto future=std::async(std::launch::async,thread_func);
bool thread_is_still_running=future.wait_for(std::chrono::seconds(0))!=std::future_status::ready;

Если вы используете эту опцию, вам нужно будет хранить объект future (например, сохраняя его в долгоживущей std::vector или глобальной переменной), так как его деструктор будет дождитесь окончания потока sh.

В качестве альтернативы вы можете использовать std::mutex и логический флаг или std::atomic<bool>, который устанавливается внутри потока непосредственно перед его выходом, чтобы указать, когда Тема закончена.

std::atomic<bool> done=false;

void thread_func(){
  do_stuff();
  done=true;
}
2 голосов
/ 22 января 2020

С std::async у вас есть возможность получить статус задачи из будущего. Нет необходимости использовать get().

https://en.cppreference.com/w/cpp/thread/future/wait_for

auto status = future.wait_for(std::chrono::milliseconds(1));
if (status == std::future_status::ready) {
    // Thread has finished
}
1 голос
/ 22 января 2020

Если вы detach a std::thread, вы потеряете канал связи, который предоставляет объект std::thread:

https://en.cppreference.com/w/cpp/thread/thread/detach

После вызова detach *this больше не владеет никаким потоком.

Если впоследствии вы хотите каким-либо образом связаться с отключенным потоком, вам нужно сделать это вручную. std::thread больше не может помочь вам после detach.

Я использую отдельный поток, потому что я не хочу, чтобы мой основной поток ожидал / блокировал новый дочерний поток, так как он имеет много других важные дела.

Правильное решение, скорее всего, не включает detach. Вам не нужно detach, чтобы поток работал параллельно, он работает параллельно, когда возвращается конструктор std::thread. Просто оставьте объект std::thread живым и выполните запрос через него, и вызывайте join только тогда, когда поток действительно должен быть завершен / завершен. Тем не менее, std::thread предоставляет только joinable, который изменяется только после join, поэтому он не предоставляет нужную вам информацию (что ваш код «выполнен» в некоторой форме).

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