C#最有可能发生线程切换?

时间:2013-12-19 18:10:36

标签: multithreading

我想知道什么时候.Net最有可能从一个线程切换到另一个线程? 我知道我们无法预测何时会发生这种情况,但这有什么情报吗?例如,当一个线程被执行时,它会在切换之前尝试等待一个方法返回或循环完成吗?

3 个答案:

答案 0 :(得分:5)

我不是.NET专家,但通常调度由内核处理。

  1. 你的线程的时间片已经过期(线程/进程只获得一定的CPU时间)

  2. 您的线程已阻止IO。

  3. 其他一些模糊的原因,如等待IPC消息,网络数据包等。

  4. 线程可以在其执行路径的任何位置被抢占,无论是循环还是从函数返回。这通常不是由底层VM(.NET或JVM)处理,而是由操作系统控制。

答案 1 :(得分:0)

当然有'智能',有点:)。运行线程集只能在中断时更改:

来自外围设备的实际硬件中断,例如。磁盘,NIC,KB,鼠标,计时器。

软件中断(即系统调用),可以改变线程的状态。这包括睡眠调用和对线程间同步对象的等待/信号调用,以及请求不能立即获得的数据的I / O调用。

如果没有中断,操作系统无法更改正在运行的线程集,因为它未输入。操作系统不知道或不关心循环,函数/方法调用(除了那些进行上述系统调用的那些),gotos或任何其他用户级流控制机制。

答案 2 :(得分:0)

我现在读了你的问题,它可能不再相关了,但在阅读了上述答案后, 我想确保:

线程由它们所属的进程管理(或者我所知道)。与操作系统无关(这就是为什么使用多线程比使用多进程更快的主要原因,因为线程之间存在数据共享,并且它们之间的切换比在两者之间发生的上下文切换更快地发生短期调度程序的过程。 (注意:有两种类型的线程:USER_MODE'线程和KERNEL_MODE'threadss,每个操作系统可以同时拥有它们或只是它们。无论如何,在用户应用程序环境中工作的线程被视为USER_MODE'线程,由它所属的流程管理。)

我写的? 感谢!!!