【发布时间】:2015-08-20 18:20:12
【问题描述】:
我试图了解 Task Parallel 库相对于使用传统多线程的好处,当我想到以下情况时,我一直在想它是处理竞争条件还是我们需要在代码中处理它?
这是我的代码:
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 变量都变得不可靠了
【问题讨论】:
-
注意 4 字节 int are usually atomics 的变量赋值。此外,我认为不需要引入新类,您可以在 lambda 表达式中使用局部变量
-
@yms 我的意思是通过使用普通线程,您通常会进入“depdt”变量变得不可靠的状态。请参阅下面的代码及其使用 Threads 的结果
-
@yms 我在回答您的评论的问题中添加了更多信息。谢谢
标签: c# .net multithreading task-parallel-library race-condition