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!