実行中の std::thread のステータスの確認
C では、 std::thread は同時実行性を実装するためのクラスの一種です。特にプラットフォームの独立性が重要である場合、std::thread がまだ実行されているかどうかを判断するのは難しい場合があります。
元々、std::thread には timed_join() メソッドがなく、joinable() は意図されていませんでした。この目的。 std::lock_guard を利用してスレッド内のミューテックスをロックし、次に try_lock() メソッドを使用してまだロックされているかどうかを評価し、スレッドの実行状態を示す代替ソリューションが提案されています。ただし、この戦略は不必要に複雑であると考えられています。
スレッドのステータスを確認するためのエレガントなソリューション
よりクリーンなアプローチとして、std::async と std::future の活用を検討してください。 std::async は別のスレッドで非同期タスクを有効にし、std::future は操作の結果を取得できるようにします。 std::future の wait_for 関数をタイムアウト 0 ミリ秒で使用すると、スレッドがまだ実行中かどうかを効果的にチェックできます。
#include <future> #include <thread> #include <chrono> #include <iostream> int main() { // Create an asynchronous task on a new thread using std::async. auto future = std::async(std::launch::async, [] { std::this_thread::sleep_for(3s); return 8; }); // Check thread status using wait_for() with zero milliseconds. auto status = future.wait_for(0ms); // Print status according to the wait_for() result. if (status == std::future_status::ready) { std::cout << "Thread finished" << std::endl; } else { std::cout << "Thread still running" << std::endl; } auto result = future.get(); // Retrieve result. }
あるいは、std::promise を使用して将来のオブジェクトを取得することもできます。 std::thread:
#include <future> #include <thread> #include <chrono> #include <iostream> int main() { // Create a promise and its associated future. std::promise<bool> p; auto future = p.get_future(); // Run a task on a new thread using std::thread. std::thread t([&p] { std::this_thread::sleep_for(3s); p.set_value(true); // Set the promise value atomically. }); // Check thread status using wait_for() as previous example. auto status = future.wait_for(0ms); // Print status according to the wait_for() result. if (status == std::future_status::ready) { std::cout << "Thread finished" << std::endl; } else { std::cout << "Thread still running" << std::endl; } t.join(); // Join the thread. }
両方の例では、ステータスが次のとおりであるため、最初は「スレッドはまだ実行中」と表示されます。スレッドが完了する前にチェックされます。ただし、さらに簡単な解決策は、アトミック ブール フラグを利用することです:
#include <thread> #include <atomic> #include <chrono> #include <iostream> int main() { // Use an atomic boolean flag for thread status tracking. std::atomic<bool> done(false); // Run a task on a new thread that sets `done` to true when finished. std::thread t([&done] { std::this_thread::sleep_for(3s); done = true; }); // Check thread status using atomic flag. if (done) { std::cout << "Thread finished" << std::endl; } else { std::cout << "Thread still running" << std::endl; } t.join(); // Join the thread. }
以上がC で実行中の std::thread のステータスを効率的に確認するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。