Je lis C++ Concurrency in Action, et viennent à travers les énoncés suivants qui décrivent deadlock
(page 47 ~ 48):Comment comprendre les instances de la même classe provoquent un problème d'interblocage dans C++ Concurrency in Action?
Le conseil commun pour éviter l'impasse est de toujours verrouiller les deux mutex dans le même ordre: si vous avez toujours verrouille mutex A avant mutex B, alors vous ne serez jamais bloqué. Parfois, cela est simple, parce que les mutex servent à des fins différentes, mais d'autres fois ce n'est pas si simple, comme lorsque les mutex protègent chacun une instance distincte de la même classe. Considérons, par exemple, une opération qui échange des données entre deux instances de la même classe; afin de garantir que les données sont correctement échangées, sans être affectées par des modifications simultanées, les mutex sur les deux instances doivent être verrouillés. Cependant, si un ordre fixe est choisi (par exemple, le mutex pour l'instance fournie en tant que premier paramètre, puis le mutex pour l'instance fournie en tant que deuxième paramètre), cela peut se retourner contre: il suffit de deux threads pour essayer échanger des données entre les deux mêmes instances avec les paramètres échangés, et vous avez un blocage!
Je suis très confus au sujet de la signification de la partie suivante:
Toutefois, si un ordre fixe est choisi (par exemple, le mutex pour l'instance fourni comme premier paramètre, le mutex pour l'instance fournie en tant que deuxième paramètre), cela peut se retourner contre: tout ce qu'il faut, c'est que deux threads essaient d'échanger des données entre les deux mêmes instances avec les paramètres échangés, et vous avez un blocage!
Dans les versions précédentes, il se réfère "an operation
", il mentionne "two threads to try to exchange data
". Quel est le scénario que l'auteur veut exprimer?