C# et le fil de sécurité d'un bool

Je suis très confus au sujet de ce sujet - si la lecture de/basculement d'une valeur booléenne est thread-safe.

    //case one, nothing
    private bool v1;
    public bool V1 { get { return v1; } set { v1 = value; } }

    //case two, with Interlocked on set
    private int v2;
    public int V2 { get { return v2; } set { Interlocked.Exchange(ref v2, value); } }

    //case three, with lock on set
    private object fieldLock = new object();
    private bool v3;
    public bool V3 { get { return v3; } set { lock (fieldLock) v3 = value; } }

Sont tous thread-safe?

MODIFIER

De ce que j'ai lu (cliquez sur) atomicité de bool ne la garantit pas thread-safe. Ensuite volatile type d'aide?

Aucune de ces sont thread-safe. Le thread qui appelle la lecture lira toujours un état de la valeur. Comment rassis il est dépend du processeur et de l'optimiseur. Les gammes de quelques nanosecondes à l'infini. La lecture doit se synchroniser. Ou si vous voulez utiliser ManualResetEvent/Slim.
le Détachement est toujours une opération atomique False, long (64 bits) cession par un 32 bits, le programme n'est pas atomique.
Un getter peut lire une ancienne valeur, ce qui est compréhensible. Cependant, comment pourrait-il durer à l'infini? À l'aide d'un verrou en lecture sur le correct valeur - de relire comme si elle était instable? Je ne pense pas que cela fonctionne de cette façon, je suis confus au sujet de ce que vous dites. Je pensais qu'une fois que personne n'est à l'écriture de plus, la lecture ne peut fonctionner correctement.
Il sera l'infini lorsque l'optimiseur de magasins de la sauvegarde de variable dans un processeur de s'inscrire et de ne pas le recharger à partir de la mémoire. Parce qu'il ne sait pas qu'un autre thread puisse le mettre à jour. Le x86 gigue n'est que si le booléen n'est pas déclaré volatile. Exemple ici.
Merci, c'est clair maintenant 🙂

OriginalL'auteur Patryk Gołębiowski | 2015-04-02