Rumah > pembangunan bahagian belakang > C++ > Bagaimana Saya Boleh Semak Status Running std::thread dalam C ?

Bagaimana Saya Boleh Semak Status Running std::thread dalam C ?

Barbara Streisand
Lepaskan: 2024-11-22 09:53:14
asal
635 orang telah melayarinya

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

Menyemak Status Running std::thread

Dalam C , std::thread ialah sejenis kelas untuk melaksanakan concurrency. Ia mungkin mencabar untuk menentukan sama ada std::thread masih berjalan, terutamanya jika kebebasan platform adalah penting.

Pada asalnya, std::thread tidak mempunyai kaedah timed_join() dan joinable() tidak bertujuan untuk tujuan ini. Penyelesaian alternatif dicadangkan yang menggunakan std::lock_guard untuk mengunci mutex dalam benang dan kemudian menggunakan kaedah try_lock() untuk menilai sama ada ia masih dikunci, menunjukkan keadaan berjalan benang. Walau bagaimanapun, strategi ini dianggap tidak perlu rumit.

Penyelesaian Elegan untuk Menyemak Status Thread

Untuk pendekatan yang lebih bersih, pertimbangkan untuk memanfaatkan std::async dan std::future. std::async mendayakan tugas tak segerak pada benang yang berasingan, dan std::future membenarkan untuk mendapatkan semula hasil operasi. Fungsi wait_for std::future boleh digunakan dengan tamat masa sifar milisaat untuk menyemak dengan berkesan sama ada utas masih berjalan:

#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.
}
Salin selepas log masuk

Sebagai alternatif, seseorang boleh menggunakan std::promise untuk mendapatkan objek masa hadapan daripada 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.
}
Salin selepas log masuk

Kedua-dua contoh pada mulanya akan memaparkan "Thread masih berjalan" kerana statusnya diperiksa sebelum benang selesai. Walau bagaimanapun, penyelesaian yang lebih mudah ialah menggunakan bendera boolean atom:

#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.
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana Saya Boleh Semak Status Running std::thread dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan