Compteur c # Thread safe fast (est)

Quel est le moyen d'obtenir un compteur thread safe en C# avec les meilleures performances possibles?

C'est aussi simple que possible:

public static long GetNextValue()
{
    long result;
    lock (LOCK)
    {
        result = COUNTER++;
    }
    return result;
}

Mais existe-t-il des alternatives plus rapides?

88
demandé sur JohnDoDo 2012-11-01 20:47:39

4 réponses

Ce serait plus simple:

return Interlocked.Increment(ref COUNTER);

MSDN verrouillé.Incrément

156
répondu Austin Salonen 2012-11-01 16:50:13

Comme recommandé par d'autres, le Interlocked.Increment aura de meilleures performances que lock(). Il suffit de jeter un oeil à L'IL et à L'assemblage où vous verrez que Increment se transforme en une instruction "bus lock" et que sa variable est directement incrémentée (x86) ou "ajoutée" à (x64).

Cette instruction "bus lock" verrouille le bus pour empêcher un autre processeur d'accéder au bus pendant que le processeur appelant effectue son fonctionnement. Maintenant, jetez un oeil à L'IL de la déclaration C# lock(). Ici, vous verrez des appels à Monitor pour commencer ou terminer une section.

En d'autres termes, l'instruction.Net lock() fait beaucoup plus que le. Net Interlocked.Increment.

DONC, si tout ce que vous voulez faire est d'incrémenter une variable, Interlock.Increment sera plus rapide. Passez en revue toutes les méthodes verrouillées pour voir les différentes opérations atomiques disponibles et pour trouver celles qui répondent à vos besoins. Utilisez lock() lorsque vous voulez faire des choses plus complexes comme plusieurs incréments/décrémentations interreliés, ou pour sérialiser l'accès à des ressources plus complexes que entier.

78
répondu Les 2016-09-05 09:20:53

Je vous suggère d'utiliser l'incrément de verrouillage intégré de. net dans le système.Bibliothèque de Threading.

Le code suivant incrémentera une variable longue par référence et est complètement thread safe:

Interlocked.Increment(ref myNum);

Source: http://msdn.microsoft.com/en-us/library/dd78zt0c.aspx

22
répondu Andrew White 2012-11-01 16:50:43
14
répondu fsimonazzi 2012-11-01 16:49:40