我正在寻找一种方法来将线程执行的预定时间片的剩余部分提供给不同的线程。 WINAPI中有一个SwitchToThread函数,但它不允许调用者指定它想要切换到的线程。我浏览了MSDN很长一段时间,并没有找到任何可以提供的东西。
对于像我这样的操作系统内部的外行,似乎屈服线程应该能够指定它想要将执行传递给哪个线程。它有可能还是仅仅是我的想象力?
答案 0 :(得分:7)
您无法将处理器时间片发送到指定线程的原因是Windows具有抢占式调度内核,这几乎将处理器时间安排的责任和权限放在手中内核,只有内核。
因为这样的线程无法控制它们何时运行,如果它们运行,甚至更少控制在它们的时间片结束后切换到哪个线程。
但是,有一些方法可能会影响上下文切换:
通过增加某个线程的优先级,您可能强制调度程序更频繁地调度它而不利于其他线程(显然反过来也适用) - 您可以降低优先级其他主题)
您可以对进程进行编码,以便在没有工作要做的时候将线程置于内核等待模式,以帮助调度程序完成它的工作。当使用适当的内核等待结构(如Critical Sections,Mutexes,Semaphores和Timers)时,您可以有效地告诉内核,在满足某个代码之前不需要调度某个线程。
注意:您很少有理由篡改任务优先级,因此小心使用
答案 1 :(得分:2)
您可以使用'fiber'而不是'threads':例如,有一个名为SwitchToFiber的Win32 API,可让您指定要安排的光纤。
答案 2 :(得分:2)
查看Windows 7中的UMS(用户模式调度)线程
http://msdn.microsoft.com/en-us/library/dd627187(VS.85).aspx
答案 3 :(得分:2)
第二个线程可以通过在其句柄上调用WaitForSingleObject()或定期轮询GetExitCodeThread()来简单地等待让步线程。其他答案对于改变操作系统的调度机制是正确的 - 最好先设置正确的线程。
答案 4 :(得分:1)
这是不可能的。只有内核可以决定下一个运行的代码,尽管你可以通过减少它必须选择的下一个运行的非等待线程来影响它,并通过SetThreadPriority设置线程优先级。
答案 5 :(得分:1)
您可以使用常规同步原语(如事件,信号量等)来序列化两个线程。这不会以任何形式阻止内核在其他CPU核心之间或在另一个CPU核心上并行调度其他线程,或者在同一核心上同时同步。这是由于现代通用操作系统的preemtive multitasking性质。
答案 6 :(得分:1)
如果您想在Windows下进行自己的日程安排,可以使用fibers,这基本上是您必须自行安排的线程。然而,鉴于你把自己描述为操作系统内部世界的门外汉,这可能是一个坏主意,因为光纤是一种先进的功能。
答案 7 :(得分:0)
我可以问为什么你想使用SwitchToThread吗?
例如,如果它是某种形式,因为线程x正在计算你想在线程Y上等待的某个值,那么我真的建议在Visual Studio 2010中查看并行模式库或异步代理库您可以使用消息块(通过异步值接收)或仅通过任务执行此操作:等待一组任务完成并在等待时内联执行...
//i.e. on an arbitrary thread
task_group* tasks;
tasks->run(... / some functor/)
对任务的调用 - > wait()将等待并内联任何正在运行的任务。