У меня есть следующий код в моей библиотеке изображений, в котором используется список процессоров для динамического управления изображениями, снятыми HttpModule
.Безопасность потока без блокировки
В настоящее время существует только один экземпляр каждого процессора, созданный для того, чтобы сохранить накладные расходы памяти, и каждый из этих процессоров имеет свойства записи, которые помогают определить порядок обработки каждого согласованного параметра querystring и хранения проанализированных значений для обработки ,
Как вы можете видеть, я в настоящее время обертываю функции методов в операторе lock
, чтобы предотвратить различные потоки из HttpModule
, перезаписывающие свойства процессоров, хотя я знаю, что это может стать узким местом. Я задаюсь вопросом: есть ли шаблон дизайна или метод, с помощью которого я могу сделать свои процессоры потокобезопасными без блокировки?
public static ImageFactory AutoProcess(this ImageFactory factory)
{
if (factory.ShouldProcess)
{
// TODO: This is going to be a bottleneck for speed. Find a faster way.
lock (SyncLock)
{
// Get a list of all graphics processors that
// have parsed and matched the querystring.
List<IGraphicsProcessor> list =
ImageProcessorConfig.Instance.GraphicsProcessors
.Where(x => x.MatchRegexIndex(factory.QueryString) != int.MaxValue)
.OrderBy(y => y.SortOrder)
.ToList();
// Loop through and process the image.
foreach (IGraphicsProcessor graphicsProcessor in list)
{
factory.Image = graphicsProcessor.ProcessImage(factory);
}
}
}
return factory;
}
У вас есть доказательства того, что это * является узким местом? Не тратьте свое драгоценное время на опасные и сложные решения проблем, которые у вас нет. Если это узкое место, тогда первая попытка решения должна заключаться в том, чтобы * перемещать как можно больше работы за пределы замка *, а не пытаться устранить блокировку *. Незаконные замки * необычайно быстры *; мы говорим о наносекундах. Контрастные замки дороги; вы можете устранить конфликт, не делая так много работы внутри замка. –
Честно говоря, я этого не делаю. Я бы подумал, что это будет так. Я зашел так далеко, как оптимизировал свой класс ImageFactory, чтобы он не нуждался в каких-либо блокировках вокруг «Bitmap's», и казалось, расточительно не оптимизировать процесс, учитывая, что я могу потенциально обрабатывать тысячи изображений. Я действительно не знал, что они так быстро. –