锁是否会产生一堆线程? /这是避免锁定的正确方法吗?

时间:2010-01-04 15:00:34

标签: c# locking

我有一个程序从非托管代码接收每秒大约500到700次的数据。这些数据中的一些是有用的,需要进行处理,其中一些是无用的,并立即得到反感。为了确定收到的数据是否有用,我使用了一个字符串列表。 我的问题/问题是:当我使用List上的锁来删除部分或全部条目时,我会得到大量的线程等待搜索List吗?

因为不连续使用删除整个列表或部分列表,我现在使用静态布尔值。当我开始删除时,我将布尔值设置为false,并且在搜索列表之前,所有数据都会被拒绝。当我完成后,我将布尔值恢复为true。 这是一个糟糕的解决方法还是有更好的解决方案? (我也问这个,因为此时测试非常耗时)

修改

该程序用于检查列表中的字符串是否正确。非托管代码发送数据,这发生在新线程上。如果数据有用,则会显示该数据,用户可以对此进行验证。如果数据结果显示但没有用,则用户可以从列表中删除主线程上发生的字符串。

2 个答案:

答案 0 :(得分:11)

是的 - 你可能会得到“大量的线程”。

我建议使用读取器/写入器语义来锁定锁,而不是单个“残酷”的独占锁。这应该使许多读者能够同时读取您的数据。只有当作者出现更新数据时才会进行独占锁定。如果写入次数相对于读取次数较少,则只需要很少的线程“备份”。

.Net ReaderWriterLockSlim是一种可能性,但我衷心建议您从Jeffrey Richter's Power Threading Library

查看OneManyResourceLock

答案 1 :(得分:0)

是否可以在将字符串添加到列表之前处理它们并仅添加所需的字符串?

这样就不需要从列表中删除了。

修改

好吧,那么,而不是字符串列表创建另一个包含两个变量的类:

  1. 字符串。
  2. 布尔值。
  3. 不是从列表中删除字符串,而是将布尔值设置为false。然后不再搜索。

    这可能会或可能不会更有效,这取决于具体情况。

    <强>优势

    您只需锁定每个单独的记录,而不是要删除的整个列表。这可以节省线程堆积。

    <强>缺点

    您没有清理列表,因此您将搜索本来会被删除的记录。

    如果需要,您可以通过使用任何空闲时间清除列表来解决此问题。