. При работе с потоком std :: Think важно контролировать статус выполнения для эффективного управления потоком. Тем не менее, метод соединения () не предназначен для определения того, работает ли поток. Вместо этого эта статья представляет различные методы, независимые от платформы для удовлетворения этой потребности.
для тех, кто удобен с c 11, std :: async и std :: future предоставляет удобное решение. С помощью std :: future :: wait_for (0ms) вы можете проверить статус потока, изучив возвращаемое значение статуса:
#include#include int main() { auto future = std::async(std::launch::async, [] { std::this_thread::sleep_for(3s); return 8; }); // Check thread status auto status = future.wait_for(0ms); if (status == std::future_status::ready) { std::cout с использованием std :: rapis (с std :: think)
] if std :: async не является вариантом, вы можете использовать STD :: Пообрести будущий объект:
#include#include int main() { std::promise p; auto future = p.get_future(); std::thread t([&p] { std::this_thread::sleep_for(3s); p.set_value(true); }); // Check thread status auto status = future.wait_for(0ms); if (status == std::future_status::ready) { std::cout { std :: this_thread :: sleep_for (3S); p.set_value (true); }); // Проверьте состояние потока auto status = future.wait_for (0ms); if (status == std :: future_status :: ready) { std :: cout с использованием std :: atomic с std :: think простой подход для C 11 и выше - использовать логический атомный флаг:
#include#include int main() { std::atomic done(false); std::thread t([&done] { std::this_thread::sleep_for(3s); done = true; }); // Check thread status if (done) { std::cout #include #include int main () { std :: atomic выполнен (false); std :: thread t ( { std :: this_thread :: sleep_for (3S); выполнено = true; }); // Проверьте состояние потока if (dode) { std :: cout
с использованием std :: packaged_task (с std :: thread)
#include#include int main() { std::packaged_task task([] { std::this_thread::sleep_for(3s); }); auto future = task.get_future(); std::thread t(std::move(task)); // Check thread status auto status = future.wait_for(0ms); if (status == std::future_status::ready) { // ... } t.join(); } #include> #include
int main () { std :: packaged_task task ([] { std :: this_thread :: sleep_for (3S); }); auto future = task.get_future (); std :: think t (std :: move (задание)); // Проверьте состояние потока auto status = future.wait_for (0ms); if (status == std :: future_status :: ready) { // ... } t.join (); } эти методы позволяют вам эффективно отслеживать состояние выполнения вашего потока std :: Обеспечение правильной обработки в различных сценариях.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3