1

在 C# 4 应用程序中,我使用任务并行库来并行处理 Web 请求。在获得 Web 响应后,需要更新一些全局变量,我决定添加一个锁块来更新这些变量。锁定语句是获得互斥的最佳选择吗?TPL 中锁语句的数量(或锁块的大小)与 TPL 的性能下降之间的确切关系是什么?

4

2 回答 2

1

如果您要更新单个变量(并且不需要多个变量作为一个原子单元一起更新),我会使用提供无锁原子功能的 Interlocked 类。如果您有许多线程都试图更新这些变量,Interlocked 将有助于减少争用。

http://msdn.microsoft.com/en-us/library/system.threading.interlocked.aspx

于 2012-04-23T16:27:24.587 回答
1

你的第一个问题的答案是:是的。和不。您可以使用一个lock块,也可以使用一个Mutex,几乎没有实际区别(在单个应用程序的上下文中)。

你的第二个问题的答案是:没有确切的关系。您可能拥有一百万个锁,但只有当它们相互阻塞时性能才会降低,并且会根据它们阻塞的程度而降低。(警告:锁定本身的行为会导致性能损失。)

您的代码的确切配置文件将确定关系是什么,并且只有通过运行一些测试并找出答案才能真正知道。

于 2012-04-23T16:17:47.160 回答