В любой СУБД, которая более чем наполовину испечена, существует различие между блокировкой чтения и блокировкой обновления. В моем многопоточном коде 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);
}