Skip to main content
 首页 » 编程设计

c#之锁会造成线程堆积吗/这是避免锁定的正确方法吗

2024年01月16日28artech

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

因为不连续使用删除整个列表或部分列表,所以我现在使用静态 bool 值。当我开始删除时,我将 bool 值设置为 false,并且在搜索列表之前将忽略所有数据。完成后,我将 bool 值恢复为真。
这是一个很好的解决方法还是有更好的解决方法?
(我也在问这个问题,因为此时测试非常耗时)

编辑

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

请您参考如下方法:

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

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

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