Nếu bạn sẵn sàng sử dụng C ++ 11 std::asyncvà std::futuređể chạy các tác vụ của mình, thì bạn có thể sử dụng wait_forchức năng std::futuređể kiểm tra xem luồng vẫn đang chạy theo cách gọn gàng như sau:
#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();
}
Nếu bạn phải sử dụng std::threadthì bạn có thể sử dụng std::promiseđể lấy một đối tượng trong tương lai:
#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();
}
Cả hai ví dụ này sẽ xuất ra:
Thread still running
Điều này là tất nhiên vì trạng thái luồng được kiểm tra trước khi tác vụ kết thúc.
Nhưng một lần nữa, có thể đơn giản hơn nếu chỉ làm như những người khác đã đề cập:
#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();
}
Biên tập:
Ngoài ra còn có cách std::packaged_tasksử dụng std::threadcho một giải pháp sạch hơn là sử dụng 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()nó và nếu có, nếu bạn chưa chỉnh sửawait()nó, nó phải đang chạy theo định nghĩa. Nhưng lý do này có thể không chính xác.