2009-04-06 4 views
1

Dans tous les SGBD qui est plus de la moitié sortis du four, il y a une distinction entre un verrou de lecture et un verrou de mise à jour. Dans mon code C# multi-thread, je, à ce jour, utilisé le mot-clé lock, mais aujourd'hui, il est venu à moi que la performance dans ma demande serait beaucoup mieux si je pouvais faire cette lecture vs distinction d'écriture dans le verrouillage; J'ai beaucoup de discussions qui pourraient lire en toute sécurité en même temps, mais ils obstruent l'autre pour le bien des écritures plus rares mais inévitables.serrures Lire en .net

Je pourrais, et je suppose que je devrais, implémenter mon propre schéma de verrouillage dans lequel la demande d'un verrou d'écriture bloque l'acquisition d'autres verrous de lecture et est bloquée jusqu'à ce que les verrous de lecture existants soient libérés.

Rien de tout cela est profondément difficile, et tout cela est décrit en détail abrutissant par date et d'autres dans le texte de la théorie de la base de données vous soin de nom.

Certes, je ne suis pas le premier à faire face à ce besoin? Qu'y a-t-il là-bas, en particulier pour C#?


Merci, Dmitri.

L'autre chose que j'espérais était les expériences et les commentaires que les gens pourraient avoir sur les forces et les faiblesses des bibliothèques que vous avez essayées.

Bon Dieu, c'est en System.Core! Arrête, Dmitri, tu me fais sentir vieux.

Je me demande quel est le moyen le plus pratique de faire pression sur Microsoft pour obtenir du sucre syntactique similaire à la syntaxe lock (object) { ... }.

Adapté de l'échantillon MSDN

public class SynchronizedCache 
{ 
    private ReaderWriterLockSlim cacheLock = new ReaderWriterLockSlim(); 
    private Dictionary<int, string> innerCache = new Dictionary<int, string>(); 

    public string Read(int key) 
    { 
    cacheLock.EnterReadLock(); 
    try 
    { 
     return innerCache[key]; 
    } 
    finally 
    { 
     cacheLock.ExitReadLock(); 
    } 
    } 

    public void Add(int key, string value) 
    { 
    cacheLock.EnterWriteLock(); 
    try 
    { 
     innerCache.Add(key, value); 
    } 
    finally 
    { 
     cacheLock.ExitWriteLock(); 
    } 
    } 
... 

qui est étroitement parallèle à l'utilisation explicite du moniteur. Avec un peu d'aide de MS, cela pourrait être aussi simple et net que cela.

private Dictionary<int, string> innerCache = new Dictionary<int, string>(); 

public string Read(int key) 
{ 
    readlock(innerCache) return innerCache[key]; 
} 
public void Add(int key, string value) 
{ 
    writelock (innerCache) innerCache.Add(key, value); 
} 

Répondre

5

Jetez un oeil à ReaderWriterLockSlim classe (ou sa version plus ancienne, ReaderWriterLock). Cette classe de verrouillage distingue les verrous en lecture et en écriture, ce qui vous permet d'avoir plusieurs lecteurs mais seulement un seul auteur.