Multicœur et synchronisation
Dans le code ci-dessus, le thread 1 prépare data puis le signale via flag, et le thread 2 lit data après avoir vu flag. Sur un CPU à modèle de cohérence faible, que faut-il pour que le thread 2 lise de façon certaine 42 ?
// スレッド1 // スレッド2
data = 42; while (flag == 0) { }
flag = 1; print(data);
- AChanger le type de data de int en long
- BGarantir l’ordre en faisant de l’écriture de flag une libération (release) et de sa lecture une acquisition (acquire)
- CNe rien écrire dans la boucle du thread 2
Afficher la réponse et l'explication
Réponse : B. Garantir l’ordre en faisant de l’écriture de flag une libération (release) et de sa lecture une acquisition (acquire)
Dans un modèle faible, les deux écritures du thread 1 peuvent être vues dans l’ordre inverse, ou la lecture de data par le thread 2 peut précéder celle de flag ; il peut donc arriver que flag vaille 1 alors que data est encore ancien. Faire de l’écriture de flag une libération garantit que les écritures antérieures sont vues avant, et faire de la lecture de flag une acquisition empêche les lectures postérieures de la devancer.
Continuer : 9 autres questions sur Multicœur et synchronisation