2009-09-04 3 views
1

J'ai une variable statique (type de données abstrait, pas une primitive) dans mon projet C# ASP.NET.lecture/écriture verrouillage d'une variable statique dans asp.net

Il sera lu par plusieurs threads, simultanément et fréquemment.

Je dois y écrire très rarement (par rapport au nombre de lectures). Quel est le meilleur moyen d'assurer la sécurité des threads de sorte que, pendant que j'écris dessus, les autres threads ne lisent pas les données partiellement écrites?

Je n'ai jamais utilisé lock, mais je comprends cela empêchera lit concurrent :(

Merci

Répondre

5

Je commencerais hors juste avec lock serrures sont très incontestées pas cher vous pourrait utiliser ReaderWriterLockSlim (en supposant que vous utilisez .N.. ET 3.5) mais un verrou est plus simple à obtenir. Optimisez-le si/quand cela devient un problème.

droite ReaderWriterLock pourrait bien être plus lent que la serrure simple - il est pas aussi rapide que cela pourrait être, par conséquent, la version slim :)

Juste à quelle fréquence voulez-vous dire par « souvent »? Combien de contention attendez-vous? Vous pourriez vouloir le modéliser (par exemple, simuler un nombre raisonnable de requêtes) et ne pas comparer le verrouillage au verrouillage simple, juste pour voir quel est le surcoût.

Vous pouvez être en mesure d'utiliser l'option sans verrouillage de volatile - mais franchement je l'ai récemment renoncé à ce trop difficile pour les gens sains d'esprit à raisonner sur. (Cela ne signifie pas ce que je pensais que cela signifiait.)

Que faites-vous réellement avec les données? Le type est-il un type immuable, donc une fois que vous avez la bonne référence, vous pouvez lire d'une manière sûre sans aucun verrouillage?

+0

Bonne conseil- qui est l'une des bizarreries dans le cadre .NET que si vous lisez à ce sujet, vous pourriez finir par faire le mauvais choix. – RichardOD

+0

@ Andrew- voici un bon article si vous voulez en savoir plus à ce sujet- http://blogs.msdn.com/pedram/archive/2007/10/07/a-performance-comparison-of-readerwriterlockslim-with-readerwriterlock .aspx – RichardOD

+0

merci pour le conseil. Je lirai à chaque demande, aussi souvent qu'il y a du trafic. l'écriture sera de l'ordre d'une fois par jour. –

0

Merci pour votre aide les gens, je me suis arrêté sur cette approche jusqu'à ce que les performances deviennent un problème. On peut supposer que cela est correct (threadsafe), où ressourcepartagée est immuable

public static class SharedResourceManager 
{ 
    private static readonly object syncLock = new object(); 

    private static SharedResource res { get; set; } 

    public static SharedResource Resource 
    { 
     get 
     { 
      lock (syncLock) 
       return res; 
     } 
     set 
     { 
      lock(syncLock) 
       res = value; 
     } 
    } 
} 
+0

Oui, c'est sûr. L'utilisation d'une variable privée volatile serait probablement bien aussi. Une raison pour laquelle vous utilisez une propriété pour 'res', étant donné que c'est privé? –

+0

merci pour l'aide :) aucune raison, supprimé il;) –

Questions connexes