gpt4 book ai didi

c# - Parallel.ForEach 中的竞争条件?

转载 作者:太空狗 更新时间:2023-10-30 00:10:05 24 4
gpt4 key购买 nike

下面的代码中是否存在竞争条件?

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);
});
}

最佳答案

是的,可能存在竞争条件。两个线程可能会像下面这样交错循环体中的语句:

Thread #1                             Thread #2
================================== ==================================
objData = GetOutputData(objInput);
objData = GetOutputData(objInput);
cbOutput.Add(objData);
cbOutput.Add(objData);

因为objData是在循环外声明的,所以两个线程共享同一个变量。结果,线程 #2 覆盖了线程 #1 设置的 objData 引用,并且线程 #2 的 objData 被添加到 cbOutput 两次。

为防止objData被多个线程共享,将其设为局部变量:

SomeDataOutput objData = GetOutputData(objInput);
cbOutput.Add(objData);

或者你可以完全去掉这个变量:

cbOutput.Add(GetOutputData(objInput));

关于c# - Parallel.ForEach 中的竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36122369/

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