我正在尝试理解使用任务并行库相较于传统多线程的优势,但当我思考以下情况时,我卡住了:它是否处理了竞态条件,还是我们需要在代码中处理?
这里是我的代码:
int depdt = 0;
Parallel.For(1, 10, mem =>
{
for (int dep = 1; dep <= 10; dep++)
{
depdt = dep;
Console.WriteLine("MEMBER: " + mem + " " + "Dependent: " + dep);
}
Console.WriteLine("Dep Value: " + depdt + " " + "mem: " + mem);
});
Console.ReadKey();
我运行了几次,没有看到任何线程干扰/覆盖"depdt"变量。但我需要确认一下。(或者)为了使其线程安全,我是否应手动创建一个类实例,并像以下代码一样实现它以避免竞争条件。
int depdt = 0;
Parallel.For(1, 10, mem =>
{
Worker worker = new Worker();
worker.DoWork(mem);
});
Console.ReadKey();
public class Worker
{
public void DoWork(int mem)
{
int depdt = 0;
for (int dep = 1; dep <= 10; dep++)
{
depdt = dep;
Console.WriteLine("MEMBER: " + mem + " " + "Dependent: " + dep);
}
Console.WriteLine("Dep Value: " + depdt +" "+ "mem: "+ mem);
}
}
回复 @yms:
我的意思是使用正常的线程时,变量depdt变得不可靠。下面是我的代码:
for (int mem = 1; mem <= 10; mem++)
{
var t= new Thread(state =>
{
for (int dep = 1; dep <= 10; dep++)
{
depdt = dep;
Console.WriteLine("MEMBER: " + mem + " " + "Dependent: " + dep);
}
Console.WriteLine("Dep Value: " + depdt + " " + "mem: " + mem);
});
t.Start(string.Format("Thread{0}", mem));
}
Console.ReadKey();
这是我的输出屏幕:事实上,mem和dep变量都变得不可靠了。