【发布时间】:2016-02-23 09:40:49
【问题描述】:
使用两个线程打印增加时间的数字,然后使用单循环打印我知道同步会增加时间,但在我的代码中如何增加时间并停止线程打印重复数字?有吗?
class Program
{
public static int count=0;
public static List<string> numbers = new List<string>();
public static int semaphore=0;
static void Main(string[] args)
{
for (int i = 0; i < 10; i++)
{
numbers.Add(i.ToString());
}
Console.WriteLine("Before start thread");
Thread tid1 = new Thread(new ThreadStart(MyThread.Thread1));
Thread tid2 = new Thread(new ThreadStart(MyThread.Thread1));
tid1.Start();
tid2.Start();
}
}
public class MyThread
{
public static object locker = new object();
public static void Thread1()
{
for (; Program.count < Program.numbers.Count;)
{
lock (locker)
{
Console.WriteLine(Program.numbers[Program.count]);
Program.count++;
}
}
}
}
// 这比线程快,为什么?
foreach (var item in numbers)
{
Console.WriteLine(item);
}
线程的平均时间是 1.5 毫秒,循环是 0.6 毫秒
【问题讨论】:
-
我知道由于等待资源锁定,时间正在增加。但就我而言,我必须使用同步。有没有增加执行时间?我的代码中没有同步?
-
嗯,由于上下文切换,线程数多于处理器内核会增加执行时间,但不会增加那么多。如果你想避免同步导致的延迟,而不仅仅是不使用需要同步的线程代码 - 设计你的应用程序,让所有可并行化的东西都可以在不同步的情况下执行。
-
在我的问题中你能想出一种并行的方法吗?
-
线程不一定会提高性能。您必须计算的实际资源是并行处理单元。如果您的并行处理单元都很忙,那么增加线程将降低性能。第二个因素是上下文切换。您拥有的线程越多,您进行上下文切换的频率就越高。如果与上下文切换时间相比,您的线程计算时间相对较低,那么多线程的性能会更差。另一个当然是共享资源。如果你的共享资源经常被两个线程访问
-
那么他们相互等待的可能性就越大。
标签: c# multithreading