Nếu bạn sẵn sàng sử dụng C ++ 11 std::async
và std::future
để chạy các tác vụ của mình, thì bạn có thể sử dụng wait_for
chứ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::thread
thì 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_task
sử dụng std::thread
cho 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.