代码之家  ›  专栏  ›  技术社区  ›  Marcin Seredynski

win32:将执行过程让给另一个(给定的)线程

  •  7
  • Marcin Seredynski  · 技术社区  · 15 年前

    我正在寻找一种方法,将线程执行的计划时间片的剩余部分生成到另一个线程。有一个 SwitchToThread 函数,但它不允许调用方指定要切换到的线程。我浏览了一段时间,还没有找到任何东西可以提供这个。

    对于像我这样的操作系统内部的非专业人员来说,似乎让步线程应该能够指定它希望将执行传递给哪个线程。是可能的还是只是我的想象?

    8 回复  |  直到 12 年前
        1
  •  7
  •   Mike Dinescu    15 年前

    无法向指定线程生成处理器时间片的原因是Windows具有 抢占式调度内核 这在很大程度上把调度处理器时间的职责和权限交给了内核,而只交给了内核。

    因此,线程在运行时没有任何控制权(如果它们运行的话),更不用说在时间片打开后切换到哪个线程了。

    但是,有几种方法可以影响上下文切换:

    • 通过提高某个线程的优先级,您可以 调度器会更频繁地调度它,这会损害其他线程(显然,反过来也适用——您可以降低其他线程的优先级)。

    • 您可以对进程进行编码,以便在线程没有工作要做时将其置于内核等待模式,以帮助调度程序完成它的工作。当使用适当的内核等待构造(如关键部分、互斥体、信号量和计时器)时,您可以有效地告诉内核在满足某个编码之前不需要调度某个线程。

    注意:很少有理由篡改任务优先级,因此请谨慎使用。

        2
  •  2
  •   ChrisW    15 年前

    您可以使用“fibers”而不是“threads”:例如,有一个名为 SwitchToFiber 它允许您指定要调度的光纤。

        3
  •  2
  •   Mark oskin    15 年前

    看看Windows7中的ums(用户模式调度)线程

    http://msdn.microsoft.com/en-us/library/dd627187(VS.85).aspx

        4
  •  2
  •   Steve    15 年前

    第二个线程可以通过在其句柄上调用waitForSingleObject()或定期轮询getExitCodeThread()来简单地等待产生的线程。对于改变操作系统的调度机制,其他的答案是正确的——首先最好正确地设计线程。

        5
  •  1
  •   martinr    15 年前

    这是不可能的。只有内核可以决定下一步运行什么代码,尽管您可以通过减少非等待线程来影响它,它必须从中选择运行下一个,并通过设置线程优先级 SetThreadPriority .

        6
  •  1
  •   Nikolai Fetissov    15 年前

    您可以使用常规的同步原语(如事件、信号量等)来序列化您的两个线程。这不会以任何形式阻止内核调度 其他 在另一个CPU内核之间或并行的线程,或 几乎同时 在同一个核心。这是由于 preemtive multitasking 现代通用操作系统的本质。

        7
  •  1
  •   dsolimano    15 年前

    如果要在Windows下执行自己的计划,可以使用 fibers ,这本质上是您必须自己安排的线程。然而,考虑到您将自己描述为操作系统内部世界的外行,这可能是一个坏主意,因为光纤是一种高级功能。

        8
  •  0
  •   Rick    15 年前

    我可以问 为什么 你想用switchtothread吗?

    例如,如果它是某种形式的,因为线程X正在计算您希望在线程Y上等待的某个值,那么我真的建议您查看Visual Studio 2010中的并行模式库或异步代理库,它允许您使用消息块(异步值接收)或通过以下任务执行此操作:wait等待一组任务完成并内联它们的执行…

    //i.e. on an arbitrary thread
    task_group* tasks;
    tasks->run(... / some functor/)
    

    调用tasks->wait()将等待并内联任何正在运行的任务。