是否建议在parallel_for_each循环中使用Windows API“SetThreadPriority”

时间:2012-09-10 16:54:33

标签: windows winapi parallel-processing thread-priority

我想减少服务于parallel_for_each的线程的线程优先级,因为在高负载条件下,它们相对于我系统中的其他线程消耗了太多的处理器时间。

问题:

1)parallel_for_each的服务线程是否继承了调用线程的线程优先级?在这种情况下,我可以在parallel_for_each之前和之后调用SetThreadPriority,一切都应该没问题。

2)或者,建议在parallel_for_each中调用SetThreadPriority吗?对于相同的线程,这将明确地多次调用API。这样做有很大的开销吗?

2.b)假设我这样做,下次调用parallel_for_each时是否会影响线程优先级 - 即我是否需要以某种方式重置每个线程的优先级?

3)我一直在想线程优先级。是否有人愿意发表评论:假设我有2个线程竞争单个处理器,一个被设置为“低于正常”,而另一个是“正常”优先级。一个线程与另一个线程相比,处理器时间大约是多少百分比?

1 个答案:

答案 0 :(得分:1)

  1. 所有主题最初都以THREAD_PRIORITY_NORMAL开头。所以你必须降低每个线程的优先级。或者降低拥有过程的优先级。

  2. 调用SetThreadPriority的开销很小。一旦你唤醒了一个线程,调用SetThreadPriority的额外费用可以忽略不计。设置线程的优先级后,它将保持该值,直到更改为止。

  3. 假设您有一个处理器,并准备好运行两个线程。调度程序将始终选择以较高优先级运行线程。这意味着在您的方案中,低于正常的线程永远不会运行。实际上,调度比这更多。例如优先级倒置。但是,你可以这样想。如果所有处理器都忙于正常的优先级线程,那么期望较低优先级的线程缺乏CPU。