许多第三方C / C ++库提供多线程支持线程的优先级,相应的调度程序等。为什么现代C ++标准不支持这个有用的功能?
答案 0 :(得分:4)
这个功能没有在标准中指定,这意味着从今天起,一个"线程"正如C ++标准所描述的那样没有优先权。
pthread_setschedparam
SetThreadPriority
对于你的程序来说,围绕这些调用(以及可能的其他平台,如果你使用其他平台)编写一个简单的包装类是很容易的。
(您可以通过使用std::thread::native_handle
)
Boost.Thread提供了关于它的说明:
以这种方式启动的线程是在定义实现的情况下创建的 线程属性为堆栈大小,调度,优先级,......或任何 平台特定属性。如何提供一个不明显 便携式界面,允许用户设置特定的平台 属性。 Boost.Thread通过课程留在中间道路 thread ::属性允许至少以可移植的方式设置 堆栈大小如下[...]
答案 1 :(得分:3)
我认为简短的回答是,如果标准包含指定优先级的方式,那么它还必须指定结果会发生什么。遗憾的是,这将导致两种可能性之一:要么强迫人们在具有不同语义的系统上完全重新实现线程,要么限制使用{{1的代码的平台可以移植。
例如,在某些系统上,具有足够高优先级的线程(例如,“实时优先级”)使用循环调度。其他系统没有 - 当一个具有足够高优先级的线程启动时,它将继续被调度,直到它运行完成或被更高优先级的线程中断。指定任一行为都会导致移植到使用另一个行为的系统时出现问题。
许多(大多数?)系统还包括一些防止低优先级线程匮乏的机制,因此即使高优先级线程已准备好运行,它们仍可继续接收某些 CPU时间。同样,细节也各不相同,一些(特别是更小/更简单)的系统根本不包括任何这样的机制。如上所述,尝试指定任何一种行为都会导致难以移植到实现不同行为的系统。
包含一个std::thread
(或类似的东西)会很容易,但是指明它的意思/做什么可能是不可能的。