我有一个函数,这是我的应用程序的主要瓶颈,因为它对线程之间共享的全局列表进行繁重的字符串比较。我的问题基本上是这样的:多个锁定在相同的函数
在1函数中多次锁定列表(称为列表gList)是否糟糕。然后稍后再次锁定(查找时进行基本锁定,解锁获取新项目以准备插入,然后再次锁定并添加新项目)。
当我你是一个探查器,我没有看到任何迹象表明,即时付出沉重的代价,但我可以在稍后的时间或当它在野外的代码?任何人都可以得到最好的体验或个人经历?
我有一个函数,这是我的应用程序的主要瓶颈,因为它对线程之间共享的全局列表进行繁重的字符串比较。我的问题基本上是这样的:多个锁定在相同的函数
在1函数中多次锁定列表(称为列表gList)是否糟糕。然后稍后再次锁定(查找时进行基本锁定,解锁获取新项目以准备插入,然后再次锁定并添加新项目)。
当我你是一个探查器,我没有看到任何迹象表明,即时付出沉重的代价,但我可以在稍后的时间或当它在野外的代码?任何人都可以得到最好的体验或个人经历?
这听起来像你不希望被释放的查找和插入的锁。要么是这样,要么在查找过程中不需要锁定。
只有当元素不在那里时才试图添加到列表中吗?如果是这样,那么释放两个步骤之间的锁允许另一个线程在准备元素时添加到列表中。在准备添加时,您的查询已过时。
如果这不是查询可能过期的问题,那么在查找过程中您可能不需要锁定。
一般而言,您希望锁定的时间尽可能短。争用成本要高得多(必须去内核),而非争用锁获取的成本(可以在用户空间中完成),所以细粒度锁定通常对性能有好处,即使它意味着获取锁定更多次。
也就是说,确保你在适当的情况下进行配置文件:一个具有大量的同时加载。否则,你的结果与现实的关系不大。
在我看来,有几个数据给出具体的答案。通常,锁的数量不会造成性能问题,而是等待该锁的线程数。
你如何执行锁定?如果还不是这种情况,你可能需要考虑使用ReaderWriterLockSlim
。
下面是一个简单的使用例子:
class SomeData
{
private IList<string> _someStrings = new List<string>();
private ReaderWriterLockSlim _lock = new ReaderWriterLockSlim();
public void Add(string text)
{
_lock.EnterWriteLock();
try
{
_someStrings.Add(text);
}
finally
{
_lock.ExitWriteLock();
}
}
public bool Contains(string text)
{
_lock.EnterReadLock();
try
{
return _someStrings.Contains(text);
}
finally
{
_lock.ExitReadLock();
}
}
}
除非实际更改列表,否则绝对只能将其锁定为读取权限 – jjxtra 2009-06-19 21:58:10
您是否还在更改和删除列表中的项目? – BlackTigerX 2009-06-19 21:47:06