檢查正在運行的std::thread 的狀態
在C 中,std::thread 是一種用於實現並發的類。確定 std::thread 是否仍在運作可能具有挑戰性,特別是在平台獨立性至關重要的情況下。
最初,std::thread 缺少 timed_join() 方法,而 joinable() 並不適用於這個目的。提出了另一個解決方案,即利用 std::lock_guard 鎖定執行緒內的互斥體,然後使用 try_lock() 方法評估它是否仍處於鎖定狀態,指示執行緒的運作狀態。然而,這種策略被認為是不必要地複雜。
檢查線程狀態的優雅解決方案
為了更簡潔的方法,請考慮利用 std::async 和 std::future。 std::async 在單獨的執行緒上啟用非同步任務,而 std::future 允許擷取操作的結果。 std::future 的wait_for 函數可以與零毫秒超時一起使用,以有效地檢查線程是否仍在運行:
#include <future> #include <thread> #include <chrono> #include <iostream> int main() { // Create an asynchronous task on a new thread using std::async. auto future = std::async(std::launch::async, [] { std::this_thread::sleep_for(3s); return 8; }); // Check thread status using wait_for() with zero milliseconds. auto status = future.wait_for(0ms); // Print status according to the wait_for() result. if (status == std::future_status::ready) { std::cout << "Thread finished" << std::endl; } else { std::cout << "Thread still running" << std::endl; } auto result = future.get(); // Retrieve result. }
或者,可以使用std::promise 從中獲取future 對象a std:: thread:
#include <future> #include <thread> #include <chrono> #include <iostream> int main() { // Create a promise and its associated future. std::promise<bool> p; auto future = p.get_future(); // Run a task on a new thread using std::thread. std::thread t([&p] { std::this_thread::sleep_for(3s); p.set_value(true); // Set the promise value atomically. }); // Check thread status using wait_for() as previous example. auto status = future.wait_for(0ms); // Print status according to the wait_for() result. if (status == std::future_status::ready) { std::cout << "Thread finished" << std::endl; } else { std::cout << "Thread still running" << std::endl; } t.join(); // Join the thread. }
兩個範例最初都會顯示“執行緒仍在運行”,因為在執行緒完成之前檢查了狀態。然而,一個更簡單的解決方案是使用原子佈林標誌:
#include <thread> #include <atomic> #include <chrono> #include <iostream> int main() { // Use an atomic boolean flag for thread status tracking. std::atomic<bool> done(false); // Run a task on a new thread that sets `done` to true when finished. std::thread t([&done] { std::this_thread::sleep_for(3s); done = true; }); // Check thread status using atomic flag. if (done) { std::cout << "Thread finished" << std::endl; } else { std::cout << "Thread still running" << std::endl; } t.join(); // Join the thread. }
以上是如何在 C 中有效地檢查正在運行的 std::thread 的狀態?的詳細內容。更多資訊請關注PHP中文網其他相關文章!