不同CPU核心上的上下文切换和线程执行

时间:2011-08-31 16:38:25

标签: c# .net multithreading context-switch memory-barriers

从我关于SO的另一个问题我发现它可能遵循简单的方法

  void B()
  {
    if (_complete)
    {
      Console.WriteLine (_answer);
    }
  }
如果在if和console writeline之间发生上下文切换,

可能会在不同的CPU上执行..这对我来说是新闻,所以我想知道现在什么时候单线程代码可以换成另一个CPU,为什么它可能在这么简单如上所述?

3 个答案:

答案 0 :(得分:6)

  

何时可以为另一个CPU切换单线程代码

这可能随时发生。话虽如此,出于实际目的,你应该真的不关心。这是任何多任务操作系统的功能。

  

为什么在如上所述的简单情况下才有意义?

根本没有帮助您的代码。它确实允许操作系统更好地平衡和处理系统上运行的其他进程。

答案 1 :(得分:4)

基本上,上下文切换是操作系统“冻结”它所在的线程,因此另一个线程可以获得一些CPU时间。当第一个线程被“解冻”时,不要求它继续在之前运行的CPU上运行。该细节由操作系统决定。

例如,如果线程解冻时有一个未使用的完整核心,这个核心与运行该线程的先前核心不同,那么不使用免费核心将是浪费。

答案 2 :(得分:0)

  

何时可以为另一个CPU切换单线程代码

任何时候。

请记住,CPU / OS看不到您的代码。它看到的机器指令与你编写的代码非常不同 - 机器指令通常(总是?)以原子方式执行,但你的程序可以在任何指令之间进行预先设置/重新调度。

  

为什么在如上所述的简单情况下才有意义?

在商品操作系统上有preemtive个调度,您的程序不是唯一运行的代码。操作系统可能需要暂停代码才能运行其他进程/线程/服务/中断处理程序。

当你的进程再次运行时,它之前运行的CPU可能已被占用,而另一个CPU可以自由使用 - 因此操作系统会在该CPU上安排你的进程。