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

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

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-24 09:46:10431ブラウズ

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

実行中の std::thread のステータスを確認する方法

この説明では、マルチスレッドにおける重要な問題、つまり std:: :thread はまだ実行中です。この知識は、さまざまなプログラミング シナリオにおけるスレッドの効果的な調整と監視に不可欠です。

課題

C の std::thread クラスには、timed_join() や joinable() のような便利なメソッドがありません。スレッドの実行ステータスを決定するために明示的に設計されています。 joinable() メソッドは主に異なる目的を目的としており、専門家は別のアプローチを模索しています。

解決策 1: std::async と std::future を活用する

std の力を利用する: :async と std::future を使用すると、スレッドのステータスを簡単に監視できます。 std::async は別のスレッドでタスクを実行し、std::future はその結果へのハンドルを提供します。タイムアウトゼロの std::future の wait_for 関数を採用することで、スレッドの実行ステータスを正確に確認できます。

auto future = std::async(std::launch::async, [] {
    std::this_thread::sleep_for(3s);
    return 8;
});

//...
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;
}

解決策 2: std::promise と std::future を利用する

std::async と std::future を使用することが不可能な場合は、代替手段として次のような方法があります。 std::promise と std::future。このアプローチにより、スレッドから直接 future オブジェクトを取得できます。

std::promise<bool> p;
auto future = p.get_future();

//...
p.set_value(true);

もう一度、future オブジェクトに wait_for を使用すると、必要なステータス情報が提供されます。

解決策 3: 次の単純なアプローチstd::thread

より単純な要件の場合、アトミック フラグを使用した次のアプローチが考えられます。 suffice:

std::atomic<bool> done(false);

//...
done = true;

アトミック フラグにアクセスすることで、スレッドがタスクを完了したかどうかを判断できます。

追加のソリューション

その他のソリューションには、std::packages_task の活用が含まれます。 、std::thread とのよりクリーンな統合、または Windows 上の Windows API などのプラットフォーム固有のメカニズムの利用を提供します。

結論

std::thread のステータスをチェックするための最適なソリューションの選択は、アプリケーションの特定の要件と制約によって異なります。これらの方法を理解することで、開発者はマルチスレッド プログラムを効果的に管理し、望ましい動作を保証できます。

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

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