2009-04-06 2 views
1

В любой СУБД, которая более чем наполовину испечена, существует различие между блокировкой чтения и блокировкой обновления. В моем многопоточном коде C# у меня на сегодняшний день используется ключевое слово lock, но сегодня мне пришло в голову, что производительность в моем приложении будет намного лучше, если я смогу сделать это прочитанным и записать различие в блокировке; У меня много потоков, которые можно было спокойно читать в одно и то же время, но они мешают друг другу ради редких, но неизбежных писем.Чтение блокировок в .net

Я мог бы, и я полагаю, что мне придется реализовать свою собственную схему блокировки, в которой запрос на блокировку записи также останавливает приобретение дополнительных блокировок чтения и останавливается до тех пор, пока не будут освобождены существующие блокировки чтения.

Ничто из этого не является сложным, и все это описано в ошеломляющей детали по дате и другим в любом тексте теории базы данных, который вы хотите назвать.

Неужели я не первый, кто столкнулся с этой необходимостью? Что там, особенно для C#?


Спасибо, Дмитрий.

Другая вещь, на которую я надеялся, - это любые впечатления и комментарии, которые могут иметь люди по сильным и слабым сторонам любых библиотек, которые вы, возможно, попробовали.

Боже мой, это в System.Core! Прекрати, Дмитрий, ты заставляешь меня чувствовать себя старым.

Интересно, какой самый практичный способ лоббировать Microsoft для обеспечения синтаксического сахара, аналогичного синтаксису lock (object) { ... }.

адаптировано из образца 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(); 
    } 
    } 
... 

, которые тесно параллелен явное использование монитора. С небольшой помощью от MS это может быть так же просто и просто.

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); 
} 

ответ

5

Посмотрите на ReaderWriterLockSlim класса (или его старой версии, ReaderWriterLock). Этот класс блокировки отличает блокировку чтения и записи, позволяя вам иметь несколько считывателей, но только один писатель.

Смежные вопросы