>백엔드 개발 >C++ >C에서 실행 중인 std::thread의 상태를 효율적으로 확인하려면 어떻게 해야 합니까?

C에서 실행 중인 std::thread의 상태를 효율적으로 확인하려면 어떻게 해야 합니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-22 09:53:14633검색

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 함수를 0밀리초 시간 초과와 함께 사용하면 스레드가 여전히 실행 중인지 효과적으로 확인할 수 있습니다.

#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.
}

두 예제 모두 상태가 확인되었기 때문에 처음에는 "Thread still running"이 표시됩니다. 스레드가 완료되기 전에. 그러나 훨씬 더 간단한 해결책은 원자 부울 플래그를 활용하는 것입니다.

#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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.