ホームページ > バックエンド開発 > C++ > C で実行中の std::thread のステータスを効率的に確認するにはどうすればよいですか?

C で実行中の std::thread のステータスを効率的に確認するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-11-22 09:53:14
オリジナル
627 人が閲覧しました

How Can I Efficiently Check the Status of a Running std::thread in C  ?

実行中の 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([&amp;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([&amp;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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート