หากคุณยินดีที่จะใช้ 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()
จะต้องทำงานตามคำจำกัดความ แต่การให้เหตุผลนี้อาจไม่ตรงประเด็น