在使用 C 開發多執行緒應用程式時,通常需要確定給定 std:: 的運行狀態線。然而,std::thread 缺乏方便的 timed_join() 方法,並且 joinable() 專門不適用於此目的。
C 11 解
如果您正在使用 C 11,一個優雅的解決方案是使用 std::async 和 std::future。 std::future 的wait_for 函數可讓您以簡潔的方式檢查線程狀態:
#include <future> #include <thread> auto future = std::async(std::launch::async, [] { ... }); // Run task on a new thread // Check thread status with zero milliseconds wait time auto status = future.wait_for(0ms); if (status == std::future_status::ready) // Thread finished else // Thread still running
使用std::promise
對於std::線程,你可以利用std::promise 來獲得future object:
#include <future> #include <thread> std::promise<bool> p; auto future = p.get_future(); std::thread t([&p] { ...; p.set_value(true); }); // Run task on a new thread // Get thread status using wait_for auto status = future.wait_for(0ms);
原子標誌方法
另一個簡單的選項是使用原子標誌:
#include <thread> #include <atomic> std::atomic<bool> done(false); std::thread t([&done] { ...; done = true; }); // Run task with flag setting if (done) // Thread finished else // Thread still running對於更乾淨的解決方案,請考慮std::packaged_task:
#include <future> #include <thread> std::packaged_task<void()> task([] { ... }); auto future = task.get_future(); std::thread t(std::move(task)); // Run task on new thread // Check thread status using wait_for auto status = future.wait_for(0ms);利用這些方法,您可以有效地檢查std::thread 是否仍在運行,確保多執行緒應用程式中更好的控制和協調。
以上是如何有效率地檢查C中std::thread的運作狀態?的詳細內容。更多資訊請關注PHP中文網其他相關文章!