Leçon 12 : Conditions de course, deadlock et atomicité
Cette leçon explore en profondeur trois pièges difficiles à déboguer : la condition de course (définition précise en C++), le deadlock (deux threads qui s'attendent mutuellement), et les opérations atomiques (std::atomic) comme alternative légère au mutex pour les compteurs simples.
condition de course = deux personnes écrivent sur la même feuille en même temps. deadlock = deux personnes détiennent ce dont l'autre a besoin et attendent. atomique = une opération indivisible — elle ne peut pas être entrecoupée.
- condition de course
- Selon la norme C++ : deux threads accèdent au même emplacement mémoire, au moins l'un des deux écrit, et il n'y a pas de synchronisation entre eux. Cela provoque un comportement indéfini (UB).
- comportement indéfini (UB)
- Une situation où la norme C++ ne définit pas ce qui se passe — le compilateur peut générer n'importe quel code, y compris des plantages, des valeurs erronées, ou parfois un fonctionnement correct.
- deadlock
- Un état dans lequel deux threads ou plus attendent chacun que l'autre libère un mutex, et où aucun ne peut jamais progresser.
- atomique
- Une opération qui s'exécute comme une unité indivisible. std::atomic<T> en C++ garantit qu'une lecture-modification-écriture n'est pas interrompue par un autre thread.
- compare-exchange
- Une opération atomique qui compare la valeur actuelle à une valeur attendue ; si elles sont égales, elle la remplace par une nouvelle valeur. C'est la base des algorithmes lock-free.