【发布时间】:2013-05-01 11:37:54
【问题描述】:
我正在尝试测试 C# parallel 方法,这是我的测试程序:
class Program
{
static int counter;
static void Main(string[] args)
{
counter = 0;
Parallel.Invoke(
() => func(1),
() => func(2),
() => func(3)
);
Console.Read();
}
static void func(int num)
{
for (int i = 0; i < 5;i++ )
{
Console.WriteLine(string.Format("This is function #{0} loop. counter - {1}", num, counter));
counter++;
}
}
}
我尝试做的是拥有 1 个静态共享变量,每个函数实例将其增加 1。
我预计counter会按顺序打印(1,2,3,...)
但输出令人惊讶:
This is function #1 loop. counter - 0
This is function #1 loop. counter - 1
This is function #1 loop. counter - 2
This is function #1 loop. counter - 3
This is function #1 loop. counter - 4
This is function #3 loop. counter - 5
This is function #2 loop. counter - 1
This is function #3 loop. counter - 6
This is function #3 loop. counter - 8
This is function #3 loop. counter - 9
This is function #3 loop. counter - 10
This is function #2 loop. counter - 7
This is function #2 loop. counter - 12
This is function #2 loop. counter - 13
This is function #2 loop. counter - 14
谁能向我解释为什么会这样?
【问题讨论】:
-
如果您希望计数器按顺序递增,那么使用 Parallel.Invoke 有什么意义?只需调用 func 3 次,无需任何并行。
-
这称为竞争条件,并行线程上的多个进程尝试访问和/或修改同一个变量实例,从而导致“意外”结果。这不是奇怪的行为,而是您应该期待的。