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
Lepaskan: 2024-11-30 15:00:15
asal
400 orang telah melayarinya

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();
}
Salin selepas log masuk

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();
}
Salin selepas log masuk

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();
}
Salin selepas log masuk

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();
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan