【发布时间】:2010-12-02 11:11:20
【问题描述】:
如何使用 Boost C++ 库设置程序/线程优先级(当谈到线程时,我指的是使用 Boost 库创建的线程)?我的意思是跨平台方式...
【问题讨论】:
如何使用 Boost C++ 库设置程序/线程优先级(当谈到线程时,我指的是使用 Boost 库创建的线程)?我的意思是跨平台方式...
【问题讨论】:
boost 本身没有通用的跨平台优先级支持。
#ifdef 是你的朋友...
查看 Tom 对 win32 解决方案的回答。
在 Linux 上,您将使用 nice 调用(或者可能是 setpriority)。不要被那些文档中关于他们调整流程优先级的声明所推迟;在 Linux 上,线程只是一个与其他一些进程/进程共享内存空间的进程。如果你给自己一个更好的“top”版本,它列出了各个线程,你可以看到每个线程的好级别。
请注意,在 Linux 上,具有普通用户权限的进程/线程只能降低其优先级(更高的“nice”值)。我在 Windows 上完成的一些优先级工作,似乎一切正常(但那是在 XP 上;情况可能与 Vista、UAC 等后不同)。
【讨论】:
上一个答案关于 Windows 允许用户将优先级更改为他们想要的任何内容的评论部分正确,但有几个例外 - 一个,通常不允许实时优先级类(即使是 UAC 提升)。它需要一个特殊的安全令牌。该令牌通常对管理员可用,但进程必须请求它。
此外,至少在 Vista+ 中,提高外部进程的优先级是默认安全策略中仅为管理员保留的权利。但是,这仅适用于外部进程 - 因此不会影响您设置自己的优先级的能力。
请记住,在 Windows 中,当您更改进程优先级时,您正在更改该进程中所有线程的“基本”优先级。您可以将优先级保持在正常状态,并根据需要调整特定线程的优先级(SetThreadPriority API 与 SetPriorityClass API)。这可能是您自己的应用程序的首选。
我认为这里不是这种情况,而是一个警告——如果作用于外部进程(不是你自己的),永远不要更改单个线程另一个进程的优先级。相反,只需更改优先级类,以便所有线程优先级在调度重要性方面保持相同的相对差异。
没有跨平台的方式来做到这一点,因为行为是如此不同。正如之前的海报所建议的那样,条件编译指令将在这种情况下使用。
【讨论】: