有没有办法强制C ++中的上下文切换到特定的线程,假设我有线程句柄或线程ID?
答案 0 :(得分:4)
不,您将无法强制操作系统来运行您想要的主题。您可以使用yield
强制进行上下文切换......
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)。