Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Semak dengan Berkesan sama ada `std::thread` Masih Berjalan dalam C ?
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.
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(); }
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(); }
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(); }
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!