2010-01-04 35 views
1

我有一个程序从每秒约500到700次的非托管代码接收数据。这些数据中的一部分是有用的,需要处理,其中一些数据是无用的,并立即遭到拒绝。要找出接收的数据是否有用,我使用字符串列表。 我的问题是:当我在List上使用锁来删除一些或所有条目时,我会得到一大堆等待搜索列表的线程?锁是否创建了一堆线程? /这是一个避免锁的正确方法

由于删除整个列表或其中的部分内容不被连续使用,我现在使用一个静态布尔值。当我开始删除时,我将Boolean设置为false,并且在搜索列表之前所有数据都被忽略。当我完成后,我把布尔变回真。 这是一个恶作剧的解决方法还是有更好的? (我也问这个,因为测试是很花时间在这一点上消费)

编辑

该程序是用来检查是否在列表中的字符串是正确的。非托管代码发送数据,这发生在一个新线程上。如果数据很有用,它会显示出来,用户可以验证这一点。如果数据变成显示但不是有用的,用户可以从列表中删除主线程中发生的字符串。

+0

你能否提供关于你的应用程序的更多细节 - 目前还不清楚。哪些线程和多少线程添加到列表中?哪些线程正在删除数据?哪些线程正在处理有用的数据?在处理完有用数据后会发生什么? – 2010-01-04 15:08:01

回答

11

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

我建议用读写器语义来查看锁而不是单一的“残酷”排他锁。这应该使许多读者能够同时读取您的数据。只有当作者来更新数据时,才会进行独占锁定。如果写入次数与读取次数相比较低,那么您将只有很少的线程“备份”。

在.NET ReaderWriterLockSlim是一种可能性,但我衷心建议你看看OneManyResourceLockJeffrey Richter's Power Threading Library

+0

Thanx为您的快速雁。但是,ReaderWriterLockSlim与我所做的不一样,因为当我编辑列表时,我只是“残忍地”锁定。 (不是我认为我的代码更好或更好,但是当我必须捍卫我的编程动作时,我可以更好地解释它) – 2010-01-04 15:27:49

+0

是 - 读/写器语义锁(如ReaderWriterLockSlim或OneManyResourceLock)会执行类似的操作,已经实施。麻烦在于手动执行,在切换和读取布尔值时是否存在潜在的线程问题。你正在同步访问这个布尔值吗?如果有优秀的线程安全替代方案,我肯定会尽量避免编写这类代码。至于你的整体做法 - 是的,如果我已经正确理解了它似乎相当合理 – 2010-01-04 15:52:02

+0

我忘了提到布尔是静态的,所以它应该是线程安全的。但我理解你的警告,并试图实现OneManyRecourceLock。 非常感谢您的建议。 – 2010-01-04 16:11:30

0

是否可以处理字符串他们得到添加到列表中之前,仅添加所需的吗?

这将删除从列表中删除的需要。

编辑

确定,然后,而不是字符串列表创建另一个类有两个变量:

  1. 的字符串。
  2. 一个布尔值。

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

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

优势

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

缺点

你是不是清除了你的列表,所以你会通过将已删除,否则记录中搜索。

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

+0

这是不可能的,因为我的程序的目的是使用传入数据来检查列表中的字符串是否正确 – 2010-01-04 15:19:20

相关问题