调度程序可以在线程中的哪个点离开并启动另一个线程?

At which point in the thread can the scheduler leave and start another thread?

假设我有两个线程 运行 并且每个线程都有一个 for 循环,当线程 1 处于 for 循环中的迭代中间时,调度程序是否可以从线程 1 转移到线程 2?所以假设 for 循环是 运行 第 n 次迭代,而在它的中间调度程序调度另一个线程。这可能吗?

当然是。调度程序可以随时切换线程。

is it possible for the scheduler to shift from thread1 to thread2 while thread1 is in the middle of an iteration in the for loop ?

假设您 运行 您的程序在支持 pre-emptive multitasking(1) 的操作系统上,是的。特别是,操作系统的调度程序将设置一个计时器,每个时间片(其中一个时间片通常在 5-10 毫秒的范围内)触发一次中断,并且在调用中断例程时,它将决定是否继续 运行 当前线程或切换到其他线程。这就是让计算机看起来同时执行多项操作的原因,即使是在单核 CPU.

上也是如此

请注意,有(并且可能仍然有)OS(例如 classic Macintosh OS) that did not have pre-emptive multitasking; when writing a program for that OS, you had to be careful to explicitly call WaitNextEvent() 时不时地出现,否则将不允许执行其他程序。这使得编写像 mp3 播放器这样的对时间敏感的程序很困难,而且还意味着一个写得不好的程序可以很容易地通过进入一个不包括对 WaitNextEvent 的调用的无限循环来冻结计算机(需要电源循环才能恢复) ().

(1) 也就是说,几乎所有面向现代消费者的 OS