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

标签 c# locking

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

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

编辑

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

最佳答案

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

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

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

关于c# - 锁会造成线程堆积吗?/这是避免锁定的正确方法吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2000043/

相关文章:

c# - 如何在单元测试中断言字典

c# - 哈希整数数组

function - 自定义 scala 递归预防机制的改进

linux - 多进程同步 - 比信号量更好的选择?

c# - 强制 HttpWebRequest 发送客户端证书

c# - 如何从客户端禁用/启用 Ajaxifeid 按钮 (JavaScript)

c# - uwp,c# Dns.GetHostAddresses() 不解析主机文件中的主机名

c# - 为什么需要冗余锁对象?

c# - 具有多个数据库调用的方法的线程安全

locking - 无法在锁或事务内启动/停止缓存