首頁 > 後端開發 > C++ > 主體

如何在 C 中有效地檢查正在運行的 std::thread 的狀態?

Barbara Streisand
發布: 2024-11-22 09:53:14
原創
552 人瀏覽過

How Can I Efficiently Check the Status of a Running std::thread in C  ?

檢查正在運行的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([&amp;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([&amp;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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板