gpt4 book ai didi

C# 线程性能,一个线程 99% 的时间

转载 作者:行者123 更新时间:2023-11-30 19:34:39 25 4
gpt4 key购买 nike

我有一个多线程 C# 应用程序。有一个字典同时从 N 个不同的线程访问。 99% 的调用来自线程 A,其余的来自 B、C、...

现在,我只是在每次访问时锁定字典。但这似乎很浪费,因为 99% 的时间我都在调用锁,线程 A 已经拥有了锁。

更有效的方法是什么?

也许线程 B、C ......可能需要某种类型的 .Begin 和 .End 调用,然后线程 A 只需在每次调用时检查一位,看看是否有任何其他线程正在使用字典。有没有人有以线程安全方式实现的此类代码示例?

最佳答案

您需要仔细检查您的探查器数据。

除非存在实际争用,否则 Monitor 和 RWLSlim 实际上不会“硬锁定”(如下拉到 OS 原语);这将在所有其他情况下使用 Interlocked,并且其性能影响相对最小(除了缓存刷新)。

在性能方面,RWLockSlim 的创建成本相对较高,并且比 Monitor 的输入成本更高。它的优点是允许多个读者和一个作者。

如果您看到出现硬锁,那么您就有实际的争用,在这种情况下,您所说的 99%/1%/1%/1%/... 比率可能并不反射(reflect)现实。

正如之前的发帖者所指出的,您应该检查使用模式 - 在大多数情况下,您偶尔会有写入和大量读取,否则系统的一致性有点难以执行。如果是这种情况,RWlockSlim 应该消除不必要的争用。

底线:这完全取决于您尝试做什么 - 正如这本词典的用途和访问方式一样。有时加宽锁以防止占用太多锁是有意义的,而在某些(非常罕见的)情况下,您可能想在尝试打开“真正的”锁之前使用无锁样式的原语,例如 Interlocked。

也许如果您告诉我们更多有关该场景的信息,我们就能提供更好的帮助。

关于C# 线程性能,一个线程 99% 的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1241187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com