C を使用してマルチスレッド アプリケーションを開発する場合、特定の std:: の実行ステータスを確認することが必要になることがよくあります。糸。ただし、std::thread には便利な timed_join() メソッドがなく、joinable() は特にこの目的を目的としたものではありません。
C 11 ソリューション
C 11 を使用している場合、洗練された解決策は std::async と std::future を採用することです。 std::future の wait_for 関数を使用すると、スレッドのステータスを簡潔な方法で確認できます。
#include <future> #include <thread> auto future = std::async(std::launch::async, [] { ... }); // Run task on a new thread // Check thread status with zero milliseconds wait time auto status = future.wait_for(0ms); if (status == std::future_status::ready) // Thread finished else // Thread still running
Using std::promise
For std::スレッドでは、std::promise を利用して将来を取得できますobject:
#include <future> #include <thread> std::promise<bool> p; auto future = p.get_future(); std::thread t([&p] { ...; p.set_value(true); }); // Run task on a new thread // Get thread status using wait_for auto status = future.wait_for(0ms);
アトミック フラグ アプローチ
もう 1 つの簡単なオプションは、アトミック フラグを使用することです:
#include <thread> #include <atomic> std::atomic<bool> done(false); std::thread t([&done] { ...; done = true; }); // Run task with flag setting if (done) // Thread finished else // Thread still running
Std: :packaging_task
よりクリーンなソリューションについては、次のことを検討してください。 std::packages_task:
#include <future> #include <thread> std::packaged_task<void()> task([] { ... }); auto future = task.get_future(); std::thread t(std::move(task)); // Run task on new thread // Check thread status using wait_for auto status = future.wait_for(0ms);
これらのアプローチを利用すると、std::thread がまだ実行されているかどうかを効果的に確認でき、マルチスレッド アプリケーションの制御と調整が向上します。
以上がC で std::thread の実行ステータスを効率的に確認するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。