首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EntLib 5缓存-怀疑死锁- cpu挂起100%

EntLib 5缓存-怀疑死锁- cpu挂起100%
EN

Stack Overflow用户
提问于 2012-06-22 09:22:20
回答 1查看 275关注 0票数 0

这个问题我已经有好几个月了。我从entlib 4.1升级到5,我的应用程序缓存的项目越来越多。有时(有时每天尝试) CPU挂起100%的使用率,但应用程序保持响应。当发生这种情况时,我使用dotTrace获取快照,并且似乎大部分时间都花在了PriorityDateComparer.Compare上。此比较器仅由System.Collections.SortedList的构造函数使用,并包含以下内容:

代码语言:javascript
复制
public int Compare(object x, object y)
{
   CacheItem leftCacheItem = (CacheItem)unsortedItems[(string)x];
   CacheItem rightCacheItem = (CacheItem)unsortedItems[(string)y];

   lock (rightCacheItem)
   {
         lock (leftCacheItem)
         {
            if (rightCacheItem == null && leftCacheItem == null)
            {
               return 0;
            }
            if (leftCacheItem == null)
            {
               return -1;
            }
            if (rightCacheItem == null)
            {
               return 1;
            }

            return leftCacheItem.ScavengingPriority == rightCacheItem.ScavengingPriority
               ? leftCacheItem.LastAccessedTime.CompareTo(rightCacheItem.LastAccessedTime)
               : leftCacheItem.ScavengingPriority - rightCacheItem.ScavengingPriority;
         }
   }
}

问题1:我们能否确保这两个缓存项总是以相同的顺序锁定?如果我检查SortedList的实现,我不这么认为。

问题2:如果我的第一个问题的答案是“否”,那我们如何解决这个问题?我看到了一些可能性:

cacheItems.

  • Somehow

  • 移除锁,并确保只使用一个线程。

  • 在unsortedItems集合上放置一个锁,而不是在

  • 上确定锁定项的顺序,例如首先比较(string)x和(string)y,然后按正确的顺序锁定它们。

  • other:.

倾向于什么?

EN

回答 1

Stack Overflow用户

发布于 2012-07-03 20:08:53

我更改了比较器,以便它不需要查找缓存项:

代码语言:javascript
复制
  int IComparer<CacheItem>.Compare(CacheItem leftCacheItem, CacheItem rightCacheItem)
  {
     lock (rightCacheItem)
     {
        lock (leftCacheItem)
        {
           if (rightCacheItem == null && leftCacheItem == null)
           {
              return 0;
           }
           if (leftCacheItem == null)
           {
              return -1;
           }
           if (rightCacheItem == null)
           {
              return 1;
           }

           return leftCacheItem.ScavengingPriority == rightCacheItem.ScavengingPriority
               ? leftCacheItem.LastAccessedTime.CompareTo(rightCacheItem.LastAccessedTime)
               : leftCacheItem.ScavengingPriority - rightCacheItem.ScavengingPriority;
        }
     }
  }

Microsoft.Practices.EnterpriseLibrary.Caching.ScavengerTask中,我相应地从以下位置更改了调用方法:

代码语言:javascript
复制
  private static SortedList SortItemsForScavenging(Hashtable unsortedItemsInCache)
  {
     return new SortedList(unsortedItemsInCache, new PriorityDateComparer(unsortedItemsInCache));
  }

代码语言:javascript
复制
  private static List<CacheItem> SortItemsForScavenging(Hashtable unsortedItemsInCache)
  {
     List<CacheItem> cacheValues = new List<CacheItem>(unsortedItemsInCache.Values.Cast<CacheItem>());
     cacheValues.Sort(new PriorityDateComparer());
     return cacheValues;
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11153477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档