C# 如何同步多个线程
我编写了这个控制台程序:C# 如何同步多个线程,c#,multithreading,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)
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
Count: 8
Count: 9
Final Count= 10
为什么它会返回不同的结果?我如何解决这个问题?好的,而不是这个:
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();
否则,您将有一个赛车和您的代码将是不确定的 好吧,而不是这个:
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();
否则,您将有一个赛车和您的代码将是不确定的 好吧,而不是这个:
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();
否则,您将有一个赛车和您的代码将是不确定的 好吧,而不是这个:
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();
否则,您将有一个赛车和您的代码将是不确定的 尝试不要像这样手动创建/终止线程,这是一个耗时的操作,而且扩展性不好 使用
线程池
或者更好:使用任务,并通过使用
等待任务来同步它们。当所有(任务列表)
尝试时,不要像这样手动创建/终止线程,这是一个耗时的操作,而且扩展性不好
使用线程池
或者更好:使用任务,并通过使用
等待任务来同步它们。当所有(任务列表)
尝试时,不要像这样手动创建/终止线程,这是一个耗时的操作,而且扩展性不好
使用线程池
或者更好:使用任务,并通过使用
等待任务来同步它们。当所有(任务列表)
尝试时,不要像这样手动创建/终止线程,这是一个耗时的操作,而且扩展性不好
使用线程池
或者更好:使用任务,并通过使用
等待任务来同步它们。当所有(任务列表)
确实-在编写原始代码时,一旦检测到任何一个线程已完成,就会显示“最终计数”。事实上,我很惊讶“Final count”消息只出现一次,因为我希望每个线程都能看到它一次……应该是这样的,但他在循环中有Console.ReadKey()。当然,程序甚至没有运行到完成*facepalm*确实如此——在编写原始代码时,一旦检测到任何一个线程已完成,“最终计数”就会显示出来。事实上,我很惊讶“Final count”消息只出现一次,因为我希望每个线程都能看到它一次……应该是这样的,但他在循环中有Console.ReadKey()。当然,程序甚至没有运行到完成*facepalm*确实如此——在编写原始代码时,一旦检测到任何一个线程已完成,“最终计数”就会显示出来。事实上,我很惊讶“Final count”消息只出现一次,因为我希望每个线程都能看到它一次……应该是这样的,但他在循环中有Console.ReadKey()。当然,程序甚至没有运行到完成*facepalm*确实如此——在编写原始代码时,一旦检测到任何一个线程已完成,“最终计数”就会显示出来。事实上,我很惊讶“Final count”消息只出现一次,因为我希望每个线程都能看到它一次……应该是这样的,但他在循环中有Console.ReadKey()。当然,程序甚至没有运行到完成*facepalm*count=inc+1代码>没有什么意义。发布实际代码。“最终计数”是可以实现的,但是如果您希望数字按顺序排列,那么就不要使用线程。count=inc+1代码>没有什么意义。发布实际代码。“最终计数”是可以实现的,但是如果您希望数字按顺序排列,那么就不要使用线程。count=inc+1代码>没有什么意义。发布实际代码。“最终计数”是可以实现的,但是如果您希望数字按顺序排列,那么就不要使用线程。count=inc+1代码>没有什么意义。发布实际代码。“最终计数”是可以实现的,但是如果你想让数字按顺序排列,就不要使用线程。不要那么快。这显然是“演示”代码,它取决于以后在实际线程中执行的内容。@Henkholtman我明白你的意思(这是有效的),但我仍然建议使用任务而不是线程。除非OP提供了为什么线程比任务(长时间运行的操作…等等)更好的信息,否则任务将提供更简单的方法来同步它们的执行。不要那么快。这显然是“演示”代码,它取决于以后在实际线程中执行的内容。@Henkholtman我明白你的意思(这是有效的),但我仍然建议使用任务而不是线程。除非OP提供了为什么线程比任务(长时间运行的操作…等等)更好的信息,否则任务将提供更简单的方法来同步它们的执行。不要那么快。这显然是“演示”代码,它取决于以后在实际线程中执行的内容。@Henkholtman我明白你的意思(这是有效的),但我仍然建议使用任务而不是线程。除非OP提供了为什么线程比任务(长时间运行的操作…等等)更好的信息,否则任务将提供更简单的方法来同步它们的执行。不要那么快。这显然是“演示”代码,它取决于以后在实际线程中执行的内容。@Henkholtman我明白你的意思(这是有效的),但我仍然建议使用任务而不是线程。除非OP提供了为什么线程比任务更好的信息(长时间运行的操作等等),否则任务将提供更简单的方法来同步它们的执行。