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