为什么新式C++库不支持优先级线程?

Why doesn't the modern C++ library support threads with priority?

本文关键字:优先级 线程 不支持 新式 C++ 为什么      更新时间:2023-10-16

许多提供多线程的第三方C/c++库支持线程的优先级,相应的调度程序等。为什么现代c++标准不支持这个有用的特性?

我认为,简短的回答是,如果标准包含一种指定优先级的方法,那么它也必须指定结果会发生什么。不幸的是,这将导致以下两种可能性之一:要么您将迫使人们在具有不同语义的系统上完全重新实现线程,要么您将限制使用std::thread的代码可以移植的平台。

例如,在某些系统上,具有足够高优先级(例如,"实时优先级")的线程使用循环调度。其他系统不会这样做——当一个足够高优先级的线程启动时,它将继续被调度,直到它运行完成或被一个更高优先级的线程中断。指定任何一种行为都会导致移植到使用另一种行为的系统时出现问题。

许多(大多数?)系统还包含一些机制来防止低优先级线程挨饿,因此即使高优先级线程准备运行,它们也可以继续接收一些 CPU时间。同样,细节也各不相同,一些(特别是较小/更简单的)系统根本不包含任何此类机制。如上所述,试图指定任何一种行为都会导致移植到实现不同行为的系统时出现困难。

包含一个set_priority(int)(或类似的东西)是很容易的,但是指定它的意义/可移植性几乎是不可能的。

这种特性在标准中没有指定,这意味着到目前为止,c++标准所描述的"线程"没有优先级。

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

为您的程序编写一个简单的包装器类来封装这些调用(如果使用其他平台,可能还会包含其他调用)是很容易的。

(您可以通过使用std::thread::native_handle检索本机线程句柄来实现)


提振。线程提供了关于它的注释:

以这种方式启动的线程是用定义的实现创建的线程属性如堆栈大小、调度、优先级等。或任何平台特定属性。不清楚如何提供一个可移植接口,允许用户设置特定的平台属性。提振。线程停留在中间的路通过类属性,它允许至少以一种可移植的方式设置堆栈大小如下[…]