«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как эффективно обнаружить, если `std :: thread` все еще работает в C ++?

Как эффективно обнаружить, если `std :: thread` все еще работает в C ++?

Опубликовано в 2025-05-03
Просматривать:413

How to Effectively Check if a `std::thread` is Still Running in C  ?

Как проверить, если поток std :: все еще работает (кросс-платформенование)

. При работе с потоком std :: Think важно контролировать статус выполнения для эффективного управления потоком. Тем не менее, метод соединения () не предназначен для определения того, работает ли поток. Вместо этого эта статья представляет различные методы, независимые от платформы для удовлетворения этой потребности.

, используя std :: async и std :: future

для тех, кто удобен с 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 :: Обеспечение правильной обработки в различных сценариях. How to Effectively Check if a `std::thread` is Still Running in C  ?

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3