【发布时间】:2016-03-21 02:47:37
【问题描述】:
以下代码中是否存在可能的竞争条件?
public void Process(List<SomeObject> list)
{
SomeDataOutput objData=null;
ConcurrentBag<SomeDataOutput> cbOutput = new ConcurrentBag<SomeDataOutput>();
ParallelOptions po = new ParallelOptions(){MaxDegreeOfParallelism=4};
Parallel.ForEach(list, po, (objInput) =>
{
objData = GetOutputData(objInput);//THIS LINE IS THE ONE I AM UNSURE OF. CAN objData GET OVERWRITTEN BY MULTIPLE PARALLEL THREADS?
cbOutput.Add(objData);
});
}
【问题讨论】:
-
这将取决于您如何实现
GetOutputData,因为这是分配或重用现有对象的方法。objData在ForEach之外声明这一事实本身并不意味着一个线程存在读取另一个线程对象的风险。 -
@PaulHicks:除了否认这是一个问题之外,您已经非常准确地描述了这个问题。
objData在 lambda 之外声明的事实意味着它是一个捕获,并且 lambda 的所有实例将共享一个变量。所以是的,肯定存在一个线程读取另一个线程对象的风险。
标签: c# race-condition parallel.foreach