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

var*_*ard 2 c++ concurrency multithreading c++11

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

qua*_*dev 5

该功能尚未在标准中指定,这意味着到目前为止,C ++标准所描述的“线程”没有优先级。

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

在程序的那些调用周围编写一个简单的包装器类很容易(如果使用其他平台,则可以调用其他包装器)。

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


Boost.Thread提供了关于此的注释:

使用实现定义的线程属性(如堆栈大小,调度,优先级或任何特定于平台的属性)创建以这种方式启动的线程。尚不清楚如何提供允许用户设置平台特定属性的便携式界面。Boost.Thread通过类thread :: attributes停留在中间,这至少允许以可移植的方式设置堆栈大小,如下所示:[...]


Jer*_*fin 5

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

仅举例来说,在某些系统上,具有足够高优先级(例如“实时优先级”)的线程使用轮询调度。其他系统则不会—当启动具有足够高优先级的线程时,它将继续进行调度,直到运行完成或被更高优先级的线程中断为止。指定任何一种行为都将导致移植到使用另一种行为的系统的问题。

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

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