使用std::thread 時,監視其執行至關重要有效執行緒管理的狀態。但是,joinable() 方法並不是為了確定執行緒是否仍在運行而設計的。相反,本文提出了各種獨立於平台的方法來滿足這一需求。
對於熟悉 C 11、std::async 和 std 的人::未來提供方便的解決方案。使用std::future::wait_for(0ms),您可以透過檢查傳回的狀態值來檢查執行緒的狀態:
#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(); }
如果std::async 不是一個選項,你可以使用std::promise 來獲得future物件:
#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(); }
C 11 及更高版本的簡單方法是利用布林原子標誌:
#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(); }
另一個選擇是利用std::packaged_task,它提供了一種更乾淨的替代方法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(); }
這些技術可以讓你有效地監控std::thread的執行狀態,確保在各種場景下得到正確的處理。
以上是如何有效地檢查'std::thread”是否仍在 C 中運行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!