Heim >Backend-Entwicklung >C++ >Wie kann ich überprüfen, ob ein „std::thread' noch in C läuft?

Wie kann ich überprüfen, ob ein „std::thread' noch in C läuft?

Barbara Streisand
Barbara StreisandOriginal
2024-12-01 06:10:13730Durchsuche

How Can I Check if a `std::thread` is Still Running in C  ?

Prüfung auf einen aktiven std::Thread

Im Bereich des Multithreadings bleibt es von entscheidender Bedeutung, zu verstehen, ob ein std::thread noch ausgeführt wird . Dieser Artikel befasst sich mit praktischen Techniken zur plattformunabhängigen Thread-Statusüberprüfung.

Verwendung von std::async und std::future

Nutzung von std::async und std: :future bietet einen nahtlosen Ansatz zur Überwachung des Thread-Status. Die Verwendung von wait_for() für das zukünftige Objekt bietet sofortigen Einblick in den Zustand des Threads:

#include <future>
#include <thread>
#include <chrono>
#include <iostream>

int main() {
    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;
    }
}

Verwendung von std::promise und std::future

Eine alternative Lösung beinhaltet die Nutzung von std::promise und std::future:

#include <future>
#include <thread>
#include <chrono>
#include <iostream>

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

    std::thread t([&amp;p] {
        std::this_thread::sleep_for(3s);
        p.set_value(true);
    });

    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();
}

Verwendung von std::atomic

Ein einfacherer Ansatz nutzt std::atomic:

#include <thread>
#include <atomic>
#include <chrono>
#include <iostream>

int main() {
    std::atomic<bool> done(false);

    std::thread t([&amp;done] {
        std::this_thread::sleep_for(3s);
        done = true;
    });

    if (done) {
        std::cout << "Thread finished" << std::endl;
    } else {
        std::cout << "Thread still running" << std::endl;
    }

    t.join();
}

Verwendung von std::packaged_task

In Verbindung mit std::thread, std::packaged_task bietet eine verfeinerte Lösung:

#include <future>
#include <thread>
#include <chrono>
#include <iostream>

int main() {
    std::packaged_task<void()> task([] {
        std::this_thread::sleep_for(3s);
    });
    auto future = task.get_future();

    std::thread t(std::move(task));

    auto status = future.wait_for(0ms);

    if (status == std::future_status::ready) {
        // ...
    }

    t.join();
}

Das obige ist der detaillierte Inhalt vonWie kann ich überprüfen, ob ein „std::thread' noch in C läuft?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn