Maison > développement back-end > C++ > Pourquoi mon programme multithread se bloque-t-il lorsqu'il est compilé avec optimisation ?

Pourquoi mon programme multithread se bloque-t-il lorsqu'il est compilé avec optimisation ?

Linda Hamilton
Libérer: 2024-12-19 08:24:56
original
972 Les gens l'ont consulté

Why Does My Multithreaded Program Hang When Compiled with Optimization?

Programme multithread bloqué en mode optimisé

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 :

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

#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>

Copier après la connexion

Explication :

Par en utilisant std::atomic, nous garantissons que la variable terminée est accessible et modifiée de manière atomique, évitant ainsi les conditions de concurrence et comportement indéfini.

Remarques supplémentaires :

  • L'utilisation de volatile à cette fin n'est pas recommandée, car elle n'est pas garantie de fournir la synchronisation nécessaire.
  • Le compilateur peut optimiser l'exécution du code, y compris les modèles d'accès aux variables. Il est important d'utiliser des primitives de synchronisation appropriées pour garantir le bon comportement du programme.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal