Si vous êtes prêt à utiliser C ++ 11 std::async
et std::future
à exécuter vos tâches, vous pouvez utiliser la wait_for
fonction de std::future
pour 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::thread
vous pouvez utiliser std::promise
pour 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_task
possibilité d'utiliser std::thread
pour 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.