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

时间:2014-07-24 16:38:02

标签: c++ multithreading c++11 concurrency

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

2 个答案:

答案 0 :(得分:4)

这个功能没有在标准中指定,这意味着从今天起,一个"线程"正如C ++标准所描述的那样没有优先权。

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

对于你的程序来说,围绕这些调用(以及可能的其他平台,如果你使用其他平台)编写一个简单的包装类是很容易的。

(您可以通过使用std::thread::native_handle

检索本机线程句柄来完成此操作

Boost.Thread提供了关于它的说明:

  

以这种方式启动的线程是在定义实现的情况下创建的   线程属性为堆栈大小,调度,优先级,......或任何   平台特定属性。如何提供一个不明显   便携式界面,允许用户设置特定的平台   属性。 Boost.Thread通过课程留在中间道路   thread ::属性允许至少以可移植的方式设置   堆栈大小如下[...]

答案 1 :(得分:3)

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

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

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

包含一个std::thread(或类似的东西)会很容易,但是指明它的意思/做什么可能是不可能的。