Problème :
Un programme multithread simple se comporte de manière inattendue lorsqu'il est compilé en modes optimisés. Alors que le programme s'exécute normalement en mode débogage ou avec -O0, il reste bloqué lorsqu'il est compilé avec -O1, -O2 ou -O3.
Solution :
Le le problème réside dans l’accès non atomique à la variable finie. Dans un environnement multithread, deux threads accédant à une variable non protégée et non atomique peuvent conduire à un comportement indéfini. Pour résoudre ce problème, la variable terminée doit être rendue atomique.
Correction :
#include <iostream> #include <future> #include <atomic> static std::atomic<bool> finished = false; int func() { size_t i = 0; while (!finished) ++i; return i; } int main() { auto result = std::async(std::launch::async, func); std::this_thread::sleep_for(std::chrono::seconds(1)); finished = true; std::cout << "result = " << result.get() << std::endl; std::cout << "\nmain thread>
Explication :
Par en utilisant std::atomic
Remarques supplémentaires :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!