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

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

Patricia Arquette
Freigeben: 2024-11-30 15:00:15
Original
473 Leute haben es durchsucht

How to Effectively Check if a `std::thread` is Still Running in C  ?

So überprüfen Sie, ob ein std::thread noch läuft (plattformübergreifend)

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.

Verwendung von std::async und std::future

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 << "Thread finished" << std::endl;
  } else {
    std::cout << "Thread still running" << std::endl;
  }

  auto result = future.get();
}
Nach dem Login kopieren

Mit std::promise (mit std::thread)

Wenn std::async keine Option ist, können Sie std::promise verwenden, um eine Zukunft zu erhalten object:

#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();
}
Nach dem Login kopieren

Using std::atomic mit std::thread

Ein einfacher Ansatz für C 11 und höher ist die Verwendung eines booleschen Atomflags:

#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();
}
Nach dem Login kopieren

Verwendung von std::packaged_task (mit std::thread)

Eine weitere Option ist die Nutzung von std::packaged_task, was eine sauberere Alternative zur Verwendung bietet 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();
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage