Maison >développement back-end >C++ >Pourquoi mon programme multithread optimisé se bloque-t-il et comment les variables atomiques peuvent-elles y remédier ?

Pourquoi mon programme multithread optimisé se bloque-t-il et comment les variables atomiques peuvent-elles y remédier ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-16 02:01:09501parcourir

Why Does My Optimized Multithreaded Program Stall, and How Can Atomic Variables Fix It?

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:

static std::atomic<bool> finished = false;

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é :

result = 1023045342
main thread>

Importance de std::atomic

Atomique Les variables, telles que std::atomic, garantissent un accès et une modification simultanés aux données partagées de manière bien définie et sécurisée pour les threads. Ils interdisent les comportements inattendus comme le déchirement et protègent contre les optimisations du compilateur qui pourraient altérer involontairement le déroulement correct du programme.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn