ホームページ >バックエンド開発 >C++ >C で `std::thread` がまだ実行されているかどうかを効果的に確認する方法

C で `std::thread` がまだ実行されているかどうかを効果的に確認する方法

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-30 15:00:15400ブラウズ

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

std::thread がまだ実行中かどうかを確認する方法 (クロスプラットフォーム)

std::thread を使用する場合、その実行を監視することが重要です効果的なスレッド管理のためのステータス。ただし、joinable() メソッドは、スレッドがまだ実行中かどうかを判断するように設計されていません。代わりに、この記事では、このニーズに対処するためのプラットフォームに依存しないさまざまな方法を紹介します。

std::async と std::future の使用

C 11、std::async、std に慣れている人向け::future は便利なソリューションを提供します。 std::future::wait_for(0ms) を使用すると、返されたステータス値を調べることでスレッドのステータスを確認できます。

#include <future>
#include <thread>

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 << "Thread finished" << std::endl;
  } else {
    std::cout << "Thread still running" << std::endl;
  }

  auto result = future.get();
}

Using std::promise (std::thread)

std::async がオプションでない場合は、std::promise を使用して将来のデータを取得できますオブジェクト:

#include <future>
#include <thread>

int main() {
  std::promise<bool> 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 << "Thread finished" << std::endl;
  } else {
    std::cout << "Thread still running" << std::endl;
  }

  t.join();
}

std::atomic の使用 with std::thread

C 11 以降の簡単なアプローチは、ブール型アトミック フラグを利用することです。

#include <atomic>
#include <thread>

int main() {
  std::atomic<bool> done(false);

  std::thread t([&done] {
    std::this_thread::sleep_for(3s);
    done = true;
  });

  // Check thread status
  if (done) {
    std::cout << "Thread finished" << std::endl;
  } else {
    std::cout << "Thread still running" << std::endl;
  }

  t.join();
}

Using std::packages_task (with std::thread)

もう 1 つのオプションは、よりクリーンな代替手段を提供する std::packages_task を利用することです。 std::promise:

#include <future>
#include <thread>

int main() {
  std::packaged_task<void()> 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();
}

これらの手法を使用すると、std::thread の実行ステータスを効率的に監視し、さまざまなシナリオで適切な処理を保証できます。

以上がC で `std::thread` がまだ実行されているかどうかを効果的に確認する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。