Heim >Backend-Entwicklung >C++ >Wie kann man effektiv überprüfen, ob ein „std::thread' in C noch läuft?
Bei der Arbeit mit std::thread ist es wichtig, seine Ausführung zu überwachen Status für eine effektive Thread-Verwaltung. Allerdings ist die Methode „joinable()“ nicht dazu gedacht, festzustellen, ob ein Thread noch läuft. Stattdessen stellt dieser Artikel verschiedene plattformunabhängige Methoden vor, um diesem Bedarf gerecht zu werden.
Für diejenigen, die mit C 11 vertraut sind: std::async und std ::future bietet eine komfortable Lösung. Mit std::future::wait_for(0ms) können Sie den Status des Threads überprüfen, indem Sie den zurückgegebenen Statuswert untersuchen:
#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 <h3>Mit std::promise (mit std::thread)</h3> <p>Wenn std::async keine Option ist, können Sie std::promise verwenden, um eine Zukunft zu erhalten object:</p> <pre class="brush:php;toolbar:false">#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 <h3>Using std::atomic<bool> mit std::thread</bool> </h3> <p>Ein einfacher Ansatz für C 11 und höher ist die Verwendung eines booleschen Atomflags:</p> <pre class="brush:php;toolbar:false">#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 <h3>Verwendung von std::packaged_task (mit std::thread)</h3> <p>Eine weitere Option ist die Nutzung von std::packaged_task, was eine sauberere Alternative zur Verwendung bietet std::promise:</p> <pre class="brush:php;toolbar:false">#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(); }</void></thread></future>
Mit diesen Techniken können Sie den Ausführungsstatus Ihres std::thread effizient überwachen und so die ordnungsgemäße Handhabung in verschiedenen Szenarien sicherstellen.
Das obige ist der detaillierte Inhalt vonWie kann man effektiv überprüfen, ob ein „std::thread' in C noch läuft?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!