Le programme multithreading se bloque en mode optimisé mais s'exécute normalement en -O0
Ce problème provient d'un programme multithreading où les variables partagées ne sont pas atomiques. Plus précisément, le problème réside dans la variable booléenne terminée à laquelle deux threads accèdent sans aucune synchronisation ni atomicité.
En mode optimisé, le compilateur suppose que les variables partagées accessibles par plusieurs threads sont protégées. Cependant, dans ce programme, finish est déclaré comme un booléen normal, ce qui le rend non atomique. Cela permet au compilateur d'optimiser les mécanismes de synchronisation essentiels au fonctionnement multithread.
Pour résoudre ce problème, terminé doit être déclaré comme std::atomic
Code fixe :
#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::cout << "\nmain thread>
Démo en direct : coliru
Considérations 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!