Multicœur et synchronisation

En C, pourquoi ajouter seulement volatile à une variable drapeau échangée entre threads est-il insuffisant comme synchronisation ?

  1. AParce qu’une variable volatile ne peut plus être lue par les autres threads
  2. BParce que volatile ne fait que restreindre les optimisations du compilateur, sans garantir l’indivisibilité des opérations ni l’ordre de visibilité pour les autres cœurs
  3. CParce qu’avec volatile, la variable est enregistrée sur disque et devient lente
Afficher la réponse et l'explication

Réponse : B. Parce que volatile ne fait que restreindre les optimisations du compilateur, sans garantir l’indivisibilité des opérations ni l’ordre de visibilité pour les autres cœurs

volatile indique au compilateur de ne pas supprimer ni regrouper les lectures et écritures de la variable ; il était à l’origine destiné à la manipulation des registres matériels. Il n’empêche pas le CPU de réordonner les opérations mémoire et ne rend pas indivisibles des opérations comme counter++. Depuis C11 et C++11, _Atomic et std::atomic garantissent à la fois l’indivisibilité et l’ordre mémoire.

S'entraîner sur ce thème Retour au thème

Autres questions sur Multicœur et synchronisation

  1. Pourquoi _Atomic de C11 et std::atomic de C++11 permettent-ils de spécifier un ordre mémoire ?
  2. Quelle comparaison entre le « verrouillage à gros grain », qui protège toute une grande structure de données par un seul verrou, et le « verrouillage à grain fin », qui protège chaque partie par un verrou distinct, est correcte ?
  3. Quelle propriété caractérise un algorithme sans verrou (lock-free) ?
  4. Quelle description de la section critique est correcte ?
  5. Quelle description de la synchronisation par barrière utilisée dans les programmes parallèles est correcte ?

Comparatifs sur ce thème