C ++ 11을 사용 std::async
하고 std::future
작업을 실행 하려는 경우의 wait_for
기능을 사용 std::future
하여 스레드가 다음과 같은 깔끔한 방식으로 여전히 실행 중인지 확인할 수 있습니다 .
#include <future>
#include <thread>
#include <chrono>
#include <iostream>
int main() {
using namespace std::chrono_literals;
auto future = std::async(std::launch::async, [] {
std::this_thread::sleep_for(3s);
return 8;
});
auto status = future.wait_for(0ms);
if (status == std::future_status::ready) {
std::cout << "Thread finished" << std::endl;
} else {
std::cout << "Thread still running" << std::endl;
}
auto result = future.get();
}
사용해야하는 경우 std::thread
다음 std::promise
개체를 가져 오는 데 사용할 수 있습니다 .
#include <future>
#include <thread>
#include <chrono>
#include <iostream>
int main() {
using namespace std::chrono_literals;
std::promise<bool> p;
auto future = p.get_future();
std::thread t([&p] {
std::this_thread::sleep_for(3s);
p.set_value(true);
});
auto status = future.wait_for(0ms);
if (status == std::future_status::ready) {
std::cout << "Thread finished" << std::endl;
} else {
std::cout << "Thread still running" << std::endl;
}
t.join();
}
이 두 예제는 모두 다음을 출력합니다.
Thread still running
물론 작업이 완료되기 전에 스레드 상태가 확인되기 때문입니다.
그러나 다른 사람들이 이미 언급 한 것처럼하는 것이 더 간단 할 수 있습니다.
#include <thread>
#include <atomic>
#include <chrono>
#include <iostream>
int main() {
using namespace std::chrono_literals;
std::atomic<bool> done(false);
std::thread t([&done] {
std::this_thread::sleep_for(3s);
done = true;
});
if (done) {
std::cout << "Thread finished" << std::endl;
} else {
std::cout << "Thread still running" << std::endl;
}
t.join();
}
편집하다:
다음 std::packaged_task
을 사용하는 std::thread
것보다 더 깨끗한 솔루션 을 위해 함께 사용할 수도 있습니다 std::promise
.
#include <future>
#include <thread>
#include <chrono>
#include <iostream>
int main() {
using namespace std::chrono_literals;
std::packaged_task<void()> task([] {
std::this_thread::sleep_for(3s);
});
auto future = task.get_future();
std::thread t(std::move(task));
auto status = future.wait_for(0ms);
if (status == std::future_status::ready) {
}
t.join();
}
wait()
하며 만약 그렇다면wait()
아직 실행 하지 않았다면 정의에 따라 실행 중이어야합니다. 그러나이 추론은 정확하지 않을 수 있습니다.