Question

Par exemple, ai-je besoin de verrouiller une valeur bool quand multithreading?

Était-ce utile?

La solution

Il n'y a pas une telle chose comme atomique type . Seules les opérations peut être atomique.

Lecture et écriture d'un type de données qui correspond à un seul mot (int sur un processeur 32 bits, long sur un processeur 64 bits) est techniquement « atomique », mais la gigue et / ou le processeur peuvent décider de modifier l'ordre des instructions et créer ainsi les conditions de course inattendues, vous devez donc soit sérialiser l'accès à lock, utilisez la classe Interlocked pour les écritures (et dans certains cas, lit), ou déclarer la volatile variable.

La réponse courte est: Si deux threads différents peuvent accéder au même champ / variable et au moins un d'entre eux sera l'écriture, vous devez utiliser une sorte de verrouillage. Pour les types primitifs qui est généralement la classe Interlocked.

Autres conseils

Question similaires

  

Pour la réponse définitive aller à la   spec. :)

     Partition I

, l'article 12.6.6 de la CLI   déclare spécifications: « Un CLI conforme doit   garantir que lecture et écriture   à des emplacements de mémoire correctement aligné   pas plus grande que la taille de mot est natif   atomique lorsque tous les accès en écriture à   un emplacement sont de la même taille. "

     

Alors que confirme que s_Initialized   ne sera jamais instable, et que lire   et écrit à des types primitve sont   atomique.

     

Interlocking crée une barrière de mémoire   pour empêcher le processeur de   réordonnancement lit et écrit. Le verrou   crée la barrière nécessaire uniquement dans   cet exemple.

     

John.

Pour l'essentiel, vous avez pas un problème « crash » de ne pas verrouiller un bool. Ce que vous pouvez avoir est une condition de course pour l'ordre dont l'bool est mis à jour ou lire. Si vous voulez que le garuntee bool est écrit / lu à partir dans un ordre spécifique, alors vous voulez utiliser une sorte de mécanisme de verrouillage.

Trier de. Il y a un excellent fil de cette , mais la version courte est, alors qu'une lecture ou d'écriture étant donné peut être atomique, c'est presque jamais ce que vous faites. Par exemple, si vous voulez incrémenter un entier, vous devez 1) lire la valeur, 2) ajouter un à la valeur et 3) stocker la valeur de retour. Tout de ces opérations peuvent être interrompues.

C'est la raison pour les classes telles que "Interlocked".

types primitifs statiques sont threadsafe, de sorte que vous n'avez pas besoin de verrouiller les variables typées. Cependant, une variable d'instance d'un type primitif est pas garantie. Voir ici: sont les types primitifs comme bool threadsafe

MSDN PrimitiveType classe

Et voici un autre lien utile qui pourrait aussi être d'intérêt que je trouve la solution très convaincante: SO Question: Comment puis-je savoir si une méthode C # est thread-safe?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top