如何同步多个线程

时间:2014-02-14 09:39:35

标签: c# multithreading

我写了这个控制台程序:

static void Main(string[] args)
{
    object sync = new object();
    Thread[] t = new Thread[10];
    int count = 0;

    for (var i = 0; i < t.Length; i++)
    {
        t[i] = new Thread(() =>
        {
            lock (sync)
            {
                int inc = count;
                Console.WriteLine("Count: {0}", count);
                count = inc + 1;
            }
        });
    }

    foreach (var t1 in t)
    {
        t1.Start();
    }

    foreach (var t1 in t)
    {
        t1.Join();
        Console.WriteLine("\nFinal Count= {0}", count);
        Console.ReadKey();
    }
}

我在输出中得到了这个结果:

Count: 0
Count: 1
Count: 2
Count: 3
Count: 4
Count: 5
Count: 6
Count: 7

Final Count= 7
Count: 8
Count: 9

当我多次运行应用程序时,我会得到更多不同的结果 但是我希望看到这个结果:

Count: 0
Count: 1
Count: 2
Count: 3
Count: 4
Count: 5
Count: 6
Count: 7
Count: 8
Count: 9

Final Count= 10

为什么会返回不同的结果,我该如何解决?

2 个答案:

答案 0 :(得分:2)

尝试不要手动创建/终止这样的线程,这是一个耗时的操作,并且不能很好地扩展。

改为使用ThreadPool

或更好:使用任务,并使用await Task.WhenAll(list of your tasks)

同步它们

答案 1 :(得分:1)

好吧,而不是这个:

foreach (var t1 in t)
{
    t1.Join();
    Console.WriteLine("\nFinal Count= {0}", count);
    Console.ReadKey();
}

你应该写:

foreach (var t1 in t)
{
    t1.Join();

}
Console.WriteLine("\nFinal Count= {0}", count);
Console.ReadKey();

否则你将参加比赛,你的代码将是不确定的。