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