我的圖像庫中有以下代碼,它利用處理器列表動態地處理由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