Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么这个简单的线程输出是正确的_C#_Multithreading - Fatal编程技术网

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

C# 为什么这个简单的线程输出是正确的,c#,multithreading,C#,Multithreading,经历这一切 为什么它不能产生这样的结果 xyxyxyxyxyxxyyxyxxxyyxyxyx.... 线程是独立的执行路径,能够与其他线程同时运行 在我看来,这两个线程并不是同时运行的。这两个线程不能同时运行,因为它们除了重复访问同一资源之外什么都不做。当一个线程正在运行时,另一个线程几乎肯定在等待控制台,无法运行。使用两个线程进行测试,这两个线程执行的操作不同于独占访问完全相同的不可共享资源 你和我可以同时出差。但是,如果你和我唯一需要做的差事需要同一辆车,那么我们将轮流完成。你不会只做一件

经历这一切

为什么它不能产生这样的结果

xyxyxyxyxyxxyyxyxxxyyxyxyx....
线程是独立的执行路径,能够与其他线程同时运行

在我看来,这两个线程并不是同时运行的。

这两个线程不能同时运行,因为它们除了重复访问同一资源之外什么都不做。当一个线程正在运行时,另一个线程几乎肯定在等待控制台,无法运行。使用两个线程进行测试,这两个线程执行的操作不同于独占访问完全相同的不可共享资源

你和我可以同时出差。但是,如果你和我唯一需要做的差事需要同一辆车,那么我们将轮流完成。你不会只做一件事,然后把车开回来,这样我就可以做一件事。那太荒谬了,我们会花所有的时间把车开回来。你会做一些差事,然后我会做一些。

这两个线程不能同时运行,因为它们除了重复访问同一资源之外什么都不做。当一个线程正在运行时,另一个线程几乎肯定在等待控制台,无法运行。使用两个线程进行测试,这两个线程执行的操作不同于独占访问完全相同的不可共享资源


你和我可以同时出差。但是,如果你和我唯一需要做的差事需要同一辆车,那么我们将轮流完成。你不会只做一件事,然后把车开回来,这样我就可以做一件事。那太荒谬了,我们会花所有的时间把车开回来。你会做一些差事,然后我会做一些。

取决于每个线程都会被设置为运行一段时间(线程数量),因为循环很紧,分配给每个线程的时间片足以输出多个打印,这就是为什么您可以看到来自每个线程的多个打印的行为。

根据的不同,每个线程将被设置为运行一定时间(线程量),因为您有紧密的循环,分配给每个线程的时间片足以输出多个打印,这就是为什么您可以看到来自每个线程的多个打印的行为。

当有人说“线程同时运行”时,他是在抽象系统看起来如何工作,而不是它实际如何工作

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

操作系统或运行时环境不断地为每个线程提供一段CPU运行时间。您获得的CPU时间片有多大是一个“已知未知”的问题

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

当有人说“线程同时运行”时,他是在抽象系统看起来是如何工作的,而不是它实际上是如何工作的

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

操作系统或运行时环境不断地为每个线程提供一段CPU运行时间。您获得的CPU时间片有多大是一个“已知未知”的问题


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

很公平,但使用这种逻辑,x将打印到1000,然后y将打印到1000。在这里,它将每个字母打印十几次,然后将控制权交给另一个线程。这是设计的吗?调度器根据其约束选择最有效的模式。从资源利用的角度来看,让一个线程达到1000会更有效,但这会给需要线程间更“公平”的应用程序带来问题。这种设计是一种折衷。一些操作系统会让一个线程耗尽其时间片。这将倾向于为具有小时间片的操作系统设计。一些操作系统会让被阻止的线程逐渐获得“动态优先级”,直到它可以在另一个线程准备好运行时抢占它。单核与多核上的行为也可能不同,并且也可能因其他核是否空闲而不同。它异常复杂,并且充满了优化延迟和吞吐量的调优和启发式方法。这很公平,但有了这个逻辑,x似乎会打印到1000,然后y会打印到1000。在这里,它将每个字母打印十几次,然后将控制权交给另一个线程。这是设计的吗?调度器根据其约束选择最有效的模式。从资源利用的角度来看,让一个线程达到1000会更有效,但这会给需要线程间更“公平”的应用程序带来问题。这种设计是一种折衷。一些操作系统会让一个线程耗尽其时间片。这将倾向于为具有小时间片的操作系统设计。一些操作系统会让被阻止的线程逐渐获得“动态优先级”,直到它可以在另一个线程准备好运行时抢占它。单核与多核上的行为也可能不同,并且也可能因其他核是否空闲而不同。它惊人地复杂,充满了优化延迟和吞吐量的调优和启发式方法。那么您的意思是,每个线程在将控制权交给另一个线程之前,有一个最长的时间可以控制一个资源?如果是这样的话,这是由C#控制的,还是低得多的级别?@Nick:我就是这么想的
xxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyy
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
yyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
...
xyxyxyxyxyxxyyxyxxxyyxyxyx....