Si vous êtes prêt à utiliser C ++ 11 std::asyncet std::futureà exécuter vos tâches, vous pouvez utiliser la wait_forfonction de std::futurepour vérifier si le thread fonctionne toujours d'une manière soignée comme celle-ci:
#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();
}
Si vous devez utiliser, std::threadvous pouvez utiliser std::promisepour obtenir un futur objet:
#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();
}
Ces deux exemples donneront:
Thread still running
C'est bien sûr parce que l'état du thread est vérifié avant la fin de la tâche.
Mais là encore, il pourrait être plus simple de le faire comme d'autres l'ont déjà mentionné:
#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();
}
Éditer:
Il y a aussi la std::packaged_taskpossibilité d'utiliser std::threadpour une solution plus propre que d'utiliser 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()et, si c'est le cas, si vous ne l'avez paswait()encore fait, il doit fonctionner par définition. Mais ce raisonnement pourrait être inexact.