Je souhaite appeler le code suivant à partir de plusieurs threads.Rendre le thread de code sûr sans utiliser l'instruction lock
// x is a global/member and initialized to 0
if (Interlocked.Increment(ref x) == 2)
{
// do something only once
}
Ceci est bien sûr pas thread-safe: si, au moment de l'exécution du premier filet est arrêté après x
a été incrémentée mais avant l'évaluation, puis le second incréments de fil x
il est donc maintenant 2, l'instruction if
est true
. Ensuite, nous revenons au premier thread et il devient également vrai dans l'instruction if
.
Cela peut être résolu en entourant le code par l'instruction lock
.
Existe-t-il un moyen de sécuriser les threads sans utiliser l'instruction lock
?
Votre scénario décrit ne se produira pas car la valeur de retour de la méthode 'Interlocked.Increment()' ne peut pas être modifiée par d'autres threads. – dymanoid
Votre code * peut être dangereux s'il accède plus tard à 'x' et suppose qu'il est le même que le résultat de l'incrément, mais vous n'avez pas montré de code ici qui démontre ce problème. –