Programme multithread optimisé bloqué en mode optimisé : résolution via des variables atomiques
Considérez le programme multithread suivant :
static 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>
Ce programme fonctionne comme prévu en mode débogage ou avec l'indicateur d'optimisation -O0. Cependant, lorsqu'il est exécuté en mode version ou avec les indicateurs d'optimisation -O1, -O2 ou -O3, il rencontre un problème et ne parvient à fournir aucun résultat.
Cause et résolution
La source du problème réside dans l'accès simultané à la variable non atomique et non protégée terminé par plusieurs threads. Cette variable ne garantit pas l'atomicité, conduisant à un comportement indéfini. Pour remédier à cela, finish doit être défini comme un std::atomic Cela résout le problème et permet au programme de s'exécuter avec succès en mode optimisé, affichant le résultat souhaité : Importance de std::atomic Atomique Les variables, telles que std::atomic Considérations supplémentaires Bien que l'utilisation de variables atomiques améliore considérablement la sécurité de la concurrence, il est essentiel d'être conscient que les optimisations peuvent avoir des conséquences considérables. Par exemple, les compilateurs peuvent optimiser les variables non protégées dans les registres ou éliminer les accès redondants pour améliorer les performances. Pour éviter les optimisations involontaires, une protection appropriée des variables et des instructions explicites au compilateur sont cruciales. 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!static std::atomic<bool> finished = false;
result = 1023045342
main thread>