现代C++库为什么不支持线程优先级?

4
许多第三方的C/C++库提供了多线程支持、线程优先级和对应的调度器等功能。为什么现代C++标准没有支持这个实用的特性呢?

1
因为没有人指定它。 - R. Martinho Fernandes
这是最终成为标准线程库的提案:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2497.html。它没有在任何地方提到优先级。 - R. Martinho Fernandes
@R. 你的意思是标准化委员会没有彻底考虑这个功能吗? - vard
当时我没有遵循标准轨迹,但是要么没有人提出考虑,要么如果有人提出,则该提案不符合纳入标准的条件。 WG21的open-std网站http://www.open-std.org/jtc1/sc22/wg21/是寻找此类答案的好地方。 - R. Martinho Fernandes
4
可能是因为线程优先级和其他属性非常依赖于系统,这使得线程库难以同时具有可移植性和实用性(但我没有详细跟踪标准化过程,因此不知道这是否是理由)。线程库提供了一个后门native_handle(),用于访问本地线程API中可用的任何功能。 - Mike Seymour
可能是因为一些系统甚至不支持它。 - James Kanze
2个回答

7

标准中没有指定此功能,这意味着按照C++标准描述的方式,“线程”没有优先级。

  • 对于POSIX系统,您可以使用pthread_setschedparam
  • 对于Windows系统,您可以使用SetThreadPriority

为您的程序编写一个简单的包装类非常容易(如果使用其他平台,则可能需要其他调用)。

(通过使用std::thread::native_handle检索本机线程句柄来执行此操作)


Boost.Thread在此处提供了以下说明

以这种方式启动的线程是使用实现定义的线程属性创建的,例如堆栈大小、调度、优先级或任何特定于平台的属性。如何提供可移植接口以允许用户设置平台特定属性并不明显。 Boost.Thread 通过 thread::attributes 类保持中间路线,允许以至少一种可移植的方式设置堆栈大小,如下所示[...]


7
我认为简短的答案是,如果标准包括一种指定优先级的方法,那么它也必须指定结果会发生什么。不幸的是,这将导致两种可能性之一:要么你强迫人们完全重新实现线程,以适应具有不同语义的系统,要么你将限制可以移植使用std::thread的代码的平台。
例如,在某些系统上,具有足够高优先级(例如“实时优先级”)的线程使用轮询调度。其他系统则不会-当具有足够高优先级的线程启动时,它将继续被调度,直到运行完成或被更高优先级的线程中断。指定任一行为都会导致在移植到实现不同行为的系统时出现问题。
许多(大多数?)系统还包括一些机制来防止低优先级线程饥饿,因此它们可以在更高优先级线程已准备好运行时继续接收一些CPU时间。同样,细节各异,一些(特别是较小/简单的)系统根本不包括任何这样的机制。如上所述,试图指定任何一种行为都会导致在移植到实现不同行为的系统时出现困难。
包括一个set_priority(int)(或类似的东西)很容易,但是指定它在可移植性上的含义/作用几乎是不可能的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接