【问题标题】:Does LINQ AsParallel() preserve thread safety?LINQ AsParallel() 是否保持线程安全?
【发布时间】:2018-12-07 09:28:37
【问题描述】:

我对使用 LINQ AsParallel() 的并发性有一些疑问。

假设我有以下代码:

int counter = 0;
someList.AsParallel().ForEach(item => {
    doStuff();
    counter++;
});

我在网上没有找到太多...

这样做安全吗?有更好的方法吗?

我应该为counter 做一些锁定操作吗?

提前致谢

【问题讨论】:

  • 如何保护通用代码的线程安全?唯一的方法是让每个线程“独占”,所以如果一个线程运行另一个线程等待..但是它就不再是并行的了! :-)
  • 是的,你是对的。

标签: c# linq plinq


【解决方案1】:

这样做安全吗? (counter++)

没有。

一开始就没有线程安全,只有单线程代码。

在并行时,应确保一切都是线程安全的。
在这种情况下:

//counter++;
Interlocked.Increment(ref counter);

而且我们看不到DoStuff() 在做什么。所有调用都应该是独立的(或使用某种形式的锁定)。

【讨论】:

  • 这就是我所需要的。不知道Interlocked。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
相关资源
最近更新 更多