我有几个使用传统语法编写的循环
foreach(x in xs) {....}
其中一些循环在计算方面非常密集,我只是使用像这样的并行语法更改它们:
Parallel.ForEach(x, xs => {...});
我看到性能有了显着提高!!现在我的问题是:我是否使用并行多线程引入了错误?我读到线程安全很复杂并且会产生奇怪的错误;我应该担心什么?
最佳答案
访问共享状态很可能不会产生预期的结果。简单示例:
int sum = 0;
for (int i = 0; i < 1000000; i++)
{
sum++;
}
将此更改为
Parallel.For(0, 1000000, i => { sum++; });
你会看到 sum
会有一些随机值,因为多个线程正在读/写 sum
。
如果锁定更新,您将解决问题,但实际上您会将操作再次变成顺序操作。
您需要确保循环中发生的任何事情都是安全的。
Microsoft 模式和实践做到了 a book这解释了这一切以及更多。在简单地更改代码以使用并行循环之前,您应该检查一下。
关于c# - 将 foreach 循环更改为 Parallel.ForEach 和奇怪的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11616833/