为什么这个简单的线程输出是正确的

时间:2012-03-16 03:15:58

标签: c# multithreading

完成此article

class ThreadTest
{
  static void Main()
  {
    Thread t = new Thread (WriteY);          // Kick off a new thread
    t.Start();                               // running WriteY()

    // Simultaneously, do something on the main thread.
    for (int i = 0; i < 1000; i++) Console.Write ("x");
  }

  static void WriteY()
  {
    for (int i = 0; i < 1000; i++) Console.Write ("y");
  }
}

产地:

xxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyy
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
yyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
...

为什么它不会产生这样的结果?:

xyxyxyxyxyxxyyxyxxxyyxyxyx....

&#34;线程是一个独立的执行路径,能够与其他线程同时运行 。&#34;

上述内容并不完全与我同步。

3 个答案:

答案 0 :(得分:4)

两个线程不能并发运行,因为它们除了重复访问同一资源外什么也不做。当一个线程正在运行时,另一个线程几乎肯定在等待控制台而无法运行。使用两个线程进行测试,这些线程除了专门访问相同的不可共享资源外,还可以执行某些操作。

你和我可以同时做差事。但如果你和我需要做的唯一差事需要同一辆车,那么我们最终会轮流。你不会只做一个差事,然后把车带回去,这样我就可以做一个差事。那太荒谬了,我们会把所有的时间都花在车上。你会做一些差事,然后我会做一些。

答案 1 :(得分:3)

取决于 scehduling policy ,每个线程都会被运行一段时间(Thread Quantum)因为你有紧密的循环,分配给每个线程的时间片是足以输出多个打印件,这就是为什么你会看到每个线程的多个打印行为。

答案 2 :(得分:0)

当有人说“线程同时运行”时,他正在抽象出系统是如何工作的,而不是它是如何工作的。

就像听到有人告诉你计算机生成随机数字一样。它并不是真的,但它似乎是,这是一个足够好的工作方式(除非它不是)。

操作系统或运行时环境不断为每个线程分配一段CPU时间来运行。你获得的CPU时间有多大是“已知未知”。

在您的示例中,线程恰好分配了足够的CPU以输出大约16个字符。在稍微不同的情况下运行它可能会得到不同的结果。这就是多线程编程的本质。