从我关于 SO 的另一个问题中,我发现它可能遵循简单的方法
void B()
{
if (_complete)
{
Console.WriteLine (_answer);
}
}
如果在 if 和控制台 writeline 调用之间发生上下文切换,则可能在不同的 CPU 上执行。这对我来说是个新闻,所以我现在想知道何时可以为另一个 CPU 切换单线程代码,以及为什么在上述简单情况下它可能有意义?
从我关于 SO 的另一个问题中,我发现它可能遵循简单的方法
void B()
{
if (_complete)
{
Console.WriteLine (_answer);
}
}
如果在 if 和控制台 writeline 调用之间发生上下文切换,则可能在不同的 CPU 上执行。这对我来说是个新闻,所以我现在想知道何时可以为另一个 CPU 切换单线程代码,以及为什么在上述简单情况下它可能有意义?
单线程代码何时可以切换到另一个 CPU
这可能随时发生。话虽如此,出于实际目的,您真的应该从不关心。这是任何多任务操作系统的功能。
为什么在上述如此简单的情况下可能有意义?
它根本对您的代码没有帮助。它确实允许操作系统更好地平衡和处理系统上运行的其他进程。
基本上,上下文切换是操作系统“冻结”线程所在的位置,以便另一个线程可以获得一些 CPU 时间。当第一个线程“解冻”时,不需要它继续在之前运行的 CPU 上运行。该细节由操作系统决定。
例如,如果当线程解冻时,有一个未使用的完整核心恰好与线程运行的前一个核心不同,那么不使用空闲核心将是一种浪费。
单线程代码何时可以切换到另一个 CPU
任何时候。
请记住,CPU/OS 看不到您的代码。它看到机器指令,这与您编写的代码非常不同 - 机器指令通常(总是?)原子执行,但您的程序可以在任何指令之间被抢占/重新调度。
以及为什么在上述如此简单的情况下可能有意义?
在商品操作系统上存在抢先调度,您的程序不是唯一运行的代码。操作系统可能需要暂停您的代码以让其他一些进程/线程/服务/中断处理程序运行。
当您的进程再次运行时,它之前运行的 CPU 可能已被占用,而还有另一个 CPU 可供使用 - 因此操作系统将您的进程安排在该 CPU 上。