【问题标题】:Boost: how to set program priority?Boost:如何设置程序优先级?
【发布时间】:2010-12-02 11:11:20
【问题描述】:

如何使用 Boost C++ 库设置程序/线程优先级(当谈到线程时,我指的是使用 Boost 库创建的线程)?我的意思是跨平台方式...

【问题讨论】:

    标签: c++ boost


    【解决方案1】:

    boost 本身没有通用的跨平台优先级支持。

    #ifdef 是你的朋友...

    查看 Tom 对 win32 解决方案的回答。

    在 Linux 上,您将使用 nice 调用(或者可能是 setpriority)。不要被那些文档中关于他们调整流程优先级的声明所推迟;在 Linux 上,线程只是一个与其他一些进程/进程共享内存空间的进程。如果你给自己一个更好的“top”版本,它列出了各个线程,你可以看到每个线程的好级别。

    请注意,在 Linux 上,具有普通用户权限的进程/线程只能降低其优先级(更高的“nice”值)。我在 Windows 上完成的一些优先级工作,似乎一切正常(但那是在 XP 上;情况可能与 Vista、UAC 等后不同)。

    【讨论】:

    • 类似地,在 Windows 中,进程优先级只影响该进程中的线程优先级——这才是真正重要的。事实上,进程优先级类的整个概念可能会产生误导,因为 Windows(和 linux)的调度程序只关注有效的线程优先级。
    【解决方案2】:
    【解决方案3】:

    上一个答案关于 Windows 允许用户将优先级更改为他们想要的任何内容的评论部分正确,但有几个例外 - 一个,通常不允许实时优先级类(即使是 UAC 提升)。它需要一个特殊的安全令牌。该令牌通常对管理员可用,但进程必须请求它。

    此外,至少在 Vista+ 中,提高外部进程的优先级是默认安全策略中仅为管理员保留的权利。但是,这仅适用于外部进程 - 因此不会影响您设置自己的优先级的能力。

    请记住,在 Windows 中,当您更改进程优先级时,您正在更改该进程中所有线程的“基本”优先级。您可以将优先级保持在正常状态,并根据需要调整特定线程的优先级(SetThreadPriority API 与 SetPriorityClass API)。这可能是您自己的应用程序的首选。

    我认为这里不是这种情况,而是一个警告——如果作用于外部进程(不是你自己的),永远不要更改单个线程另一个进程的优先级。相反,只需更改优先级类,以便所有线程优先级在调度重要性方面保持相同的相对差异。

    没有跨平台的方式来做到这一点,因为行为是如此不同。正如之前的海报所建议的那样,条件编译指令将在这种情况下使用。

    【讨论】:

      猜你喜欢
      • 2010-12-01
      • 2014-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 2014-10-27
      相关资源
      最近更新 更多