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 <h3>Menggunakan std::promise (dengan std::thread)</h3> <p>Jika std::async bukan pilihan, anda boleh menggunakan std::promise untuk mendapatkan masa depan objek:</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>Menggunakan std::atomic<bool> dengan std::thread</bool> </h3> <p>Pendekatan mudah untuk C 11 dan seterusnya ialah menggunakan bendera atom boolean:</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>Menggunakan std::packaged_task (dengan std::thread)</h3> <p>Pilihan lain ialah memanfaatkan std::packaged_task, yang menyediakan alternatif yang lebih bersih daripada menggunakan 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>
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!