#cpp #многопоточность #cpp11
Как в С++11 узнать состояние потока, то есть работает или нет такой-то поток?
Ответы
Ответ 1
Как вы объясните системе, состояние какого потока Вам нужно проверить? Ваш вопрос принципиально некорректен. Предупреждая возможный ответ: по id в ОС нельзя, т.к. номер может быть занят уже другим потоком, если один перестал работать. Если же у Вас уже есть какой-то handle потока, то узнать его состояние можно средствами того же API, средствами которого Вы этот handle получили. В частности, если речь идет именно об std::thread, то этот вопрос дубликат вот этого: https://stackoverflow.com/questions/9094422/how-to-check-if-a-stdthread-is-still-running UPD: Для std::thread есть несколько вариантов, по-сути являющихся вариациями передачи флага о завершении в поток и проверки этого флага. Вариант для std::thread + std::promise: #include#include #include #include int main() { // Создаём объект promise и получаем из него future. std::promise p; auto future = p.get_future(); // Запускаем задачу в отдельном потоке std::thread t([&p] { std::this_thread::sleep_for(std::chrono::seconds(3)); p.set_value(true); }); // С помощью ожидания на future мы получаем статус потока auto status = future.wait_for(std::chrono::milliseconds(0)); if (status == std::future_status::ready) { std::cout << "Thread finished" << std::endl; } else { std::cout << "Thread still running" << std::endl; } t.join(); } Вариант с std::thread + std::atomic: #include #include #include #include int main() { std::atomic done(false); // Атомарный флаг. //Всё как и в прошлом примере, но теперь используем atomic вместо promise std::thread t([&done] { std::this_thread::sleep_for(std::chrono::seconds(3)); done = true; }); if (done) { std::cout << "Thread finished" << std::endl; } else { std::cout << "Thread still running" << std::endl; } t.join(); } Вариант с std::thread и std::packaged_task, наиболее "чистый" с точки зрения архитектуры решения, т.к. решение достигается средствами языка, а не жонглированием флагами: #include #include #include #include int main() { //Создаём packaged_task, передав в неё задачу и получаем объект future. std::packaged_task task([] { std::this_thread::sleep_for(std::chrono::seconds(3)); }); auto future = task.get_future(); //Запускаем задачу в выделенном потоке. std::thread t(std::move(task)); auto status = future.wait_for(std::chrono::milliseconds(0)); if (status == std::future_status::ready) { //Поток завершён, т.е. задача, переданная в packaged_task завершилась(дошла до return) // ... } t.join(); } Ответ 2
Если нужно узнать запущен ли поток то проверяйте на joinable. Если же узнать завершилось ли выполнение работы потока, то можно воспользоваться условными переменными (condition_variable)
Комментариев нет:
Отправить комментарий