Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Semak dengan Berkesan sama ada `std::thread` Masih Berjalan dalam C ?

Bagaimana untuk Semak dengan Berkesan sama ada `std::thread` Masih Berjalan dalam C ?

Patricia Arquette
Patricia Arquetteasal
2024-11-30 15:00:15403semak imbas

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

Cara Semak sama ada std::thread Masih Berjalan (Rentas Platform)

Apabila bekerja dengan std::thread, adalah penting untuk memantau pelaksanaannya status untuk pengurusan benang yang berkesan. Walau bagaimanapun, kaedah joinable() tidak direka untuk menentukan sama ada thread masih berjalan. Sebaliknya, artikel ini membentangkan pelbagai kaedah bebas platform untuk menangani keperluan ini.

Menggunakan std::async dan std::future

Bagi mereka yang selesa dengan C 11, std::async dan std :: masa depan menyediakan penyelesaian yang mudah. Dengan std::future::wait_for(0ms), anda boleh menyemak status thread dengan memeriksa nilai status yang dikembalikan:

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

Menggunakan std::promise (dengan std::thread)

Jika std::async bukan pilihan, anda boleh menggunakan std::promise untuk mendapatkan masa depan objek:

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

Menggunakan std::atomic dengan std::thread

Pendekatan mudah untuk C 11 dan seterusnya ialah menggunakan bendera atom boolean:

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

Menggunakan std::packaged_task (dengan std::thread)

Pilihan lain ialah memanfaatkan std::packaged_task, yang menyediakan alternatif yang lebih bersih daripada menggunakan 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();
}

Teknik ini membolehkan anda memantau dengan cekap status pelaksanaan std::thread anda, memastikan pengendalian yang betul dalam pelbagai senario.

Atas ialah kandungan terperinci Bagaimana untuk Semak dengan Berkesan sama ada `std::thread` Masih Berjalan dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn