После того, как вы отсоединили поток, вы явно сказали: «Мне не нужно ждать окончания этой темы 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;
}