在Windows中强制上下文切换

| 假设我具有线程句柄或线程ID,是否有办法强制C ++在特定线程中进行上下文切换?     
已邀请:
不,您将无法强制操作系统运行所需的线程。您可以使用
yield
强制上下文切换... Win32 API中的“ 0”是函数“ 2”。如果没有其他线程可用于运行,则将返回零值,并且当前线程仍将继续运行。     
您只能鼓励Windows线程调度程序选择某个线程,而不能强制这样做。首先,通过在同步对象上创建线程块并发出信号来实现此目的。通过提高优先级来辅助。 支持显式上下文切换,您必须使用光纤。查看SwitchToFiber()。从长远来看,光纤不是线程,它类似于旧的例程。纤维的全盛时期已经过去了,它们不再与线程竞争。它们的CPU缓存位置非常糟糕,无法利用多个内核。     
强制特定线程运行的唯一方法是使用进程/线程亲和力,但是我无法想象这是一个合理的解决方案。 强制进行上下文切换的唯一方法是使用亲缘关系将线程强制到其他处理器上。 换句话说,您尝试做的事实际上并不可行。 如果还有另一个准备运行的线程可以在此处理器上运行,则调用ѭ3将导致上下文切换。该文档指出如下:   如果调用SwitchToThread函数   导致操作系统切换   执行到另一个线程,   返回值非零。      如果没有其他线程准备   执行,操作系统不执行   将执行切换到另一个线程,   返回值为零。     
您可以在bump4ѭ调用循环时临时更改其他线程的优先级:这会将控制权传递给其他线程。假设另一个线程增加了一个
lock
变量,您需要等待直到它再次变为零:
// Wait until other thread releases lock
SetThreadPriority(otherThread, THREAD_PRIORITY_HIGHER);
while (InterlockedRead(&lock) != 0)
  Sleep(0);
SetThreadPriority(otherThread, THREAD_PRIORITY_NORMAL);
    
我会看看《 Windows并行编程》这本书。调度程序似乎做了一些值得注意的事情。 Sleep(0)仅产生更高优先级的线程(或其他可能具有相同优先级的线程)。这意味着您不能仅使用Sleep(0)来解决优先级倒置的情况,而其他较低优先级的线程则需要运行。您必须使用SwitchToThread,以非零时间睡眠或在某些内核HANDLE上完全阻塞。     
您可以创建两个同步对象(例如两个事件),并使用API​​ SignalObjectAndWait。 如果
hObjectToWaitOn
没有信号,而您的其他线程正在
hObjectToSignal
上等待,则OS理论上可以在时间片结束之前在此API内执行快速上下文切换。 而且,如果您希望当前线程自动恢复,只需在
dwMilliseconds
上通知一个较小的值(例如50或100)。     

要回复问题请先登录注册