强制在Windows中进行上下文切换

时间:2011-05-01 12:49:35

标签: windows multithreading context-switch

有没有办法强制C ++中的上下文切换到特定的线程,假设我有线程句柄或线程ID?

6 个答案:

答案 0 :(得分:4)

不,您将无法强制操作系统来运行您想要的主题。您可以使用yield强制进行上下文切换......

Win32 API中的

yield是函数SwitchToThread。如果没有其他线程可供运行,那么将返回 ZERO 值,并且当前线程仍会继续运行。

答案 1 :(得分:4)

您只能鼓励Windows线程调度程序选择某个线程,您不能强制它。首先,通过在同步对象上创建线程块并发信号通知它。通过提高其优先级来进行中等。

支持显式上下文切换,您必须使用光纤。查看SwitchToFiber()。光纤远远不是一个线程,它类似于旧的共同例程。纤维的鼎盛时期已经过去,它们不再与线程竞争。它们具有非常糟糕的cpu缓存局部性,无法利用多个核心。

答案 2 :(得分:2)

强制运行特定线程的唯一方法是使用进程/线程关联,但我无法想象这是一个合理解决方案的问题。

强制进行上下文切换的唯一方法是使用affinity将线程强制到不同的处理器上。

换句话说,你要做的事情并不是真的可行。

如果有另一个准备运行的线程有资格在此处理器上运行,则调用SwitchToThread()将导致上下文切换。文档说明如下:

  

如果调用SwitchToThread函数   导致操作系统切换   执行到另一个线程,   返回值非零。

     

如果没有其他线程准备好   执行,操作系统没有   将执行切换到另一个线程,   并且返回值为零。

答案 3 :(得分:1)

在使用Sleep(0)调用循环时,您可以暂时提高其他线程的优先级:这会将控制传递给其他线程。假设另一个线程增加了一个lock变量,你需要等到它再次变为零:

// Wait until other thread releases lock
SetThreadPriority(otherThread, THREAD_PRIORITY_HIGHER);
while (InterlockedRead(&lock) != 0)
  Sleep(0);
SetThreadPriority(otherThread, THREAD_PRIORITY_NORMAL);

答案 4 :(得分:1)

我会查看“Concurrent Programming for Windows”一书。调度程序似乎做了一些值得注意的事情。

Sleep(0)仅产生更高优先级的线程(或者可能是相同优先级的其他线程)。这意味着您无法通过Sleep(0)来修复优先级反转情况,其中需要运行其他较低优先级的线程。您必须使用SwitchToThread,睡眠非零持续时间或完全阻止某些内核HANDLE。

答案 5 :(得分:1)

您可以创建两个同步对象(例如两个events)并使用API​​ SignalObjectAndWait

如果hObjectToWaitOn未发信号,而您的另一个线程正在等待hObjectToSignal,则操作系统理论上 在此API内执行快速上下文切换时间片。

如果您希望当前线程自动恢复,只需通知dwMilliseconds上的小值(例如50或100)。