为什么新式C++库不支持优先级线程?
Why doesn't the modern C++ library support threads with priority?
许多提供多线程的第三方C/c++库支持线程的优先级,相应的调度程序等。为什么现代c++标准不支持这个有用的特性?
我认为,简短的回答是,如果标准包含一种指定优先级的方法,那么它也必须指定结果会发生什么。不幸的是,这将导致以下两种可能性之一:要么您将迫使人们在具有不同语义的系统上完全重新实现线程,要么您将限制使用std::thread
的代码可以移植的平台。
例如,在某些系统上,具有足够高优先级(例如,"实时优先级")的线程使用循环调度。其他系统不会这样做——当一个足够高优先级的线程启动时,它将继续被调度,直到它运行完成或被一个更高优先级的线程中断。指定任何一种行为都会导致移植到使用另一种行为的系统时出现问题。
许多(大多数?)系统还包含一些机制来防止低优先级线程挨饿,因此即使高优先级线程准备运行,它们也可以继续接收一些 CPU时间。同样,细节也各不相同,一些(特别是较小/更简单的)系统根本不包含任何此类机制。如上所述,试图指定任何一种行为都会导致移植到实现不同行为的系统时出现困难。包含一个set_priority(int)
(或类似的东西)是很容易的,但是指定它的意义/可移植性几乎是不可能的。
这种特性在标准中没有指定,这意味着到目前为止,c++标准所描述的"线程"没有优先级。
- 对于POSIX系统,可以使用
pthread_setschedparam
- 对于Windows,可以使用
SetThreadPriority
为您的程序编写一个简单的包装器类来封装这些调用(如果使用其他平台,可能还会包含其他调用)是很容易的。
(您可以通过使用std::thread::native_handle
检索本机线程句柄来实现)
提振。线程提供了关于它的注释:
以这种方式启动的线程是用定义的实现创建的线程属性如堆栈大小、调度、优先级等。或任何平台特定属性。不清楚如何提供一个可移植接口,允许用户设置特定的平台属性。提振。线程停留在中间的路通过类属性,它允许至少以一种可移植的方式设置堆栈大小如下[…]
相关文章:
- 将更高的优先级设置为 boost::asio 线程处理进程
- asio::io_service 具有多个线程的优先级队列处理
- 如何使用 pthreads 以正确的方式设置两个线程之一的优先级
- C++互斥锁线程优先级
- 根据线程优先级/特权授予对资源的访问权限
- 如何在不需要 root 访问权限的情况下为应用程序中的线程设置相对线程优先级
- 在优先级最低的核心中运行线程
- 检查Linux功能以设置线程优先级
- 如何在Windows NT中获取线程的动态优先级
- 使用pthreads时的后台线程(不错,优先级)
- 如何在C++的低优先级线程中运行方法
- 如何降低 QT Gui 线程优先级
- 如何在Mac操作系统上设置线程优先级pthreads
- C++Win32 在低优先级模式下运行应用程序/线程
- 如何在互斥锁中赋予特权线程优先级
- C++线程网络优先级
- 如何确定流程的"经理"和"工作线程"线程的优先级(或为其设置调度策略)?
- C++ & boost::threads - 如何根据工作类型确定线程的优先级?
- 当多个高优先级线程在多个内核上运行时,Linux内核没有响应
- 为什么新式C++库不支持优先级线程?