Читать блокировки в .net - PullRequest
1 голос
/ 06 апреля 2009

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

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

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

Конечно, я не первый, кто сталкивается с этой необходимостью? Что там, особенно для 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();
    }
  }
...

, который тесно связан с явным использованием Monitor. С небольшой помощью 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);
}

1 Ответ

5 голосов
/ 06 апреля 2009

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

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