我的图像库中有以下代码,它利用处理器列表动态地处理由HttpModule
捕获的图像。线程安全无锁
目前只创建每个处理器的一个实例,以便减少内存开销,并且每个处理器都有可写属性,这些属性有助于确定处理每个匹配查询字符串参数的顺序并存储解析值以处理。
正如你所看到的,我目前正在将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;
}
您是否有证据证明这是一个瓶颈?不要浪费宝贵的时间来解决你没有的问题的危险和棘手的解决方案。如果它是一个瓶颈,那么解决方案的第一次尝试应该是*尽可能多地在锁外部进行工作*而不是试图*消除锁*。非常规锁定非常快*;我们正在谈论纳秒。竞争锁定价格昂贵;您可以通过在锁内不做太多工作来消除争用。 – 2013-03-04 23:45:17
说实话,我没有。我会想,虽然它会。我已经尽可能地优化了我的ImageFactory类,以便它不需要围绕“Bitmap”进行任何锁定,并且考虑到我可能有可能处理数千个图像,因此没有尽可能优化该流程似乎是浪费。 我其实并不知道他们那么快。 – 2013-03-04 23:49:47