在linux下我们可以通过
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine)(void*), void *arg);
来创建线程,但是如何设置线程的优先级呢?
在讨论这个问题的时候,我们先要确定当前线程使用的调度策略,posix提供了
int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy);函数来获取所
使用的调度策略,它们是:
SCHED_FIFO, SCHED_RR 和 SCHED_OTHER。
我们可以使用
int sched_get_priority_max(int policy);
int sched_get_priority_min(int policy);
来获取线程线程可是设置的最大和最小的优先级值,如果调用成功就返回最大和最小的优先级值,否则返回-1。
从我现在运行的linux系统中,我使用下列程序获取了对应三种调度策略中的最大和最小优先级:
policy = SCHED_OTHER
Show current configuration of priority
max_priority = 0
min_priority = 0
Show SCHED_FIFO of priority
max_priority = 99
min_priority = 1
Show SCHED_RR of priority
max_priority = 99
min_priority = 1
Show priority of current thread
priority = 0
Set thread policy
Set SCHED_FIFO policy
policy = SCHED_FIFO
Set SCHED_RR policy
policy = SCHED_RR
Restore current policy
policy = SCHED_OTHER
我们可以看到
SCHED_OTHER
是不支持优先级使用的,而SCHED_FIFO和SCHED_RR支持优先级的使用,他们分别为1和99,
数值越大
优先级越高。 从上面的结果我们可以看出,如果程序控制线程的优先级,一般是用
pthread_attr_getschedpolicy来获取系统使用的调度策略,如果是SCHED_OTHER的话,表明当前策略
不支持线程优先级的使用,否则可以。当然所设定的优先级范围必须在最大和最小值之间。我们可以通过
sched_get_priority_max
和sched_get_priority_min来获取。
可能网友会问,是否我们可以通过
int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);来设定自己所需的
调度策略呢?我觉得是完全可以的(有些系统需要定义
_POSIX_THREAD_PRIORITY_SCHEDULING),只要
系统实现了对应的调用策略。
说了半天,我们还没有说,在系统允许使用线程优先级别的时候,如何设置优先级别呢?
int pthread_attr_setschedparam(pthread_attr_t *attr,
const struct sched_param *param);
int pthread_attr_getschedparam(const pthread_attr_t *attr,
struct sched_param *param);
上面两个函数分别用于设置线程的优先级,struct sched_param的定义如下
struct sched_param
{
int __sched_priority; //所要设定的线程优先级
};
使用的测试程序:
#include <iostream>
#include <pthread.h>
#include <sched.h>
#include <assert.h>
using namespace std;
static int get_thread_policy( pthread_attr_t &attr )
{
int policy;
int rs = pthread_attr_getschedpolicy( &attr, &policy );
assert( rs == 0 );
switch ( policy )
{
case SCHED_FIFO:
cout << "policy = SCHED_FIFO" << endl;
break;
case SCHED_RR:
cout << "policy = SCHED_RR" << endl;
break;
case SCHED_OTHER:
cout << "policy = SCHED_OTHER" << endl;
break;
default:
cout << "policy = UNKNOWN" << endl;
break;
}
return policy;
}
static void show_thread_priority( pthread_attr_t &attr, int policy )
{
int priority = sched_get_priority_max( policy );
assert( priority != -1 );
cout << "max_priority = " << priority << endl;
priority = sched_get_priority_min( policy );
assert( priority != -1 );
cout << "min_priority = " << priority << endl;
}
static int get_thread_priority( pthread_attr_t &attr )
{
struct sched_param param;
int rs = pthread_attr_getschedparam( &attr, ¶m );
assert( rs == 0 );
cout << "priority = " << param.__sched_priority << endl;
return param.__sched_priority;
}
static void set_thread_policy( pthread_attr_t &attr,int policy )
{
int rs = pthread_attr_setschedpolicy( &attr, policy );
assert( rs == 0 );
get_thread_policy( attr );
}
int main( void )
{
pthread_attr_t attr;
struct sched_param sched;
int rs;
rs = pthread_attr_init( &attr );
assert( rs == 0 );
int policy = get_thread_policy( attr );
cout << "Show current configuration of priority" << endl;
show_thread_priority( attr, policy );
cout << "Show SCHED_FIFO of priority" << endl;
show_thread_priority( attr, SCHED_FIFO );
cout << "Show SCHED_RR of priority" << endl;
show_thread_priority( attr, SCHED_RR );
cout << "Show priority of current thread" << endl;
int priority = get_thread_priority( attr );
cout << "Set thread policy" << endl;
cout << "Set SCHED_FIFO policy" << endl;
set_thread_policy( attr, SCHED_FIFO );
cout << "Set SCHED_RR policy" << endl;
set_thread_policy( attr, SCHED_RR );
cout << "Restore current policy" << endl;
set_thread_policy( attr, policy );
rs = pthread_attr_destroy( &attr );
assert( rs == 0 );
return 0;
}
相关推荐
在Windows系统中,Java线程优先级与Windows线程优先级对应,而在Unix/Linux系统中,Java线程优先级的映射可能更为复杂,甚至可能被忽略。因此,开发者应当理解,尽管Java提供了线程优先级机制,但其实际效果可能因...
在大多数操作系统中,线程优先级分为多个等级,例如在Windows中有实时、高、正常、低等优先级,而在Unix/Linux系统中,通常使用Nice值来表示线程的优先级,范围从-20(最高优先级)到19(最低优先级)。 在多线程的...
《Telechips音频解码器在Linux/Unix系统中的编程指南》 本指南主要针对Telechips公司的TCCXX系列音频解码系统,为Linux/Unix平台上的开发者提供详尽的使用和编程指导。Telechips是一家知名的半导体公司,其音频解码...
在Windows系统中,Java线程的优先级会映射到操作系统的线程优先级,而在Unix/Linux系统中,这种映射关系可能不同,因此在不同的操作系统上,同样的优先级设置可能会导致不同的执行行为。 另外,线程的优先级设置...
在Linux系统中,配置文件通常位于/etc目录下,用于存储系统服务、应用软件及各种设置。它们可以是文本文件,由管理员通过编辑器如vi或nano进行修改。常见的配置文件有: - `/etc/passwd`:存储用户账户信息。 - `/...
3. 在多线程环境中,对线程优先级的调整可能比对进程优先级的调整更精细,但也可能导致线程之间的交互变得复杂。 4. 优先级继承和优先级天花板是解决优先级反转问题的策略,适用于实时操作系统。 C++标准库并没有...
在Linux和Unix系统中,编程通常涉及到对操作系统内核的深入理解,包括进程管理、内存管理、I/O操作等。开发者需要熟悉C或C++等低级语言,以及相关的开发工具,如gcc编译器、gdb调试器和make构建工具。此外,熟悉...
在IT行业中,Linux/Unix操作系统是开发者和系统管理员的重要工具,尤其在服务器管理和软件开发领域。标题中的"prvgram.rar_Linux/Unix编程_Others_"暗示了这个压缩包可能包含了一些与Linux/Unix系统编程相关的源代码...
6. **线程优先级**:虽然Linux和Unix支持线程优先级,但具体实现依赖于调度策略(如SCHED_RR、SCHED_FIFO)。使用`pthread_setschedparam()`设置线程优先级,但需要注意优先级反转和优先级继承问题。 7. **线程安全...
在Linux和Unix操作系统中,多线程编程是创建并发执行任务的一种重要方法。`pthread`是POSIX线程库在这些系统上的实现,它提供了一组API,使得开发者能够利用多核处理器的潜力,提高程序的执行效率。本文将深入探讨`...
在Linux/Unix操作系统中,进程是执行中的程序实例,而`fork()`函数是C语言标准库中用于创建新进程的关键接口。本资料包"fork.rar"聚焦于Linux/Unix编程,特别是C/C++环境下如何利用`fork()`进行进程控制。通过深入...
在Linux系统中,多线程编程是实现并发执行任务的重要技术。这个"linux多线程demo"示例可能是一个用于教学或实践的项目,通过CMake构建系统进行编译,适用于嵌入式环境,比如ARM架构设备。让我们深入探讨一下多线程、...
在编程实践中,线程编程可能会涉及到很多细节,比如初始化线程、终止线程、线程的取消处理、设置和获取线程优先级、发送信号给线程、处理线程的信号掩码、Fork的线程安全操作、销毁线程等。这些操作对于控制线程行为...
标题中的"ptpd-2-RC-0.tar.gz"是一个针对Linux/Unix操作系统的软件包,主要用于实现精准时间协议...在实际应用中,开发者和管理员还需要熟悉Linux或Unix的系统管理、网络配置以及与PTP相关的行业标准和实践。
在Linux和Unix操作系统中,线程池是一种优化资源管理和提高系统效率的技术。它涉及到多线程编程,特别是在处理大量并发任务时,线程池能够提供更稳定、高效的性能。线程池的基本思想是预先创建一组线程,这些线程不...
- **POSIX线程标准(Pthreads)**:这是Linux和其他类Unix系统中最常见的线程API标准,它规定了创建、管理线程的方法。 ##### 多线程的益处 - **提高应用程序的响应性**:通过在后台执行耗时的任务,主线程仍然...
在IT行业中,Linux和Unix操作系统是开发者和系统管理员的重要平台,尤其在服务器和嵌入式领域。本资源“rt.rar”似乎聚焦于Linux实时调度类(Real-Time Scheduling Class),适用于Linux内核版本2.13.6。在这个主题...
在IT领域,线程编程是多任务处理的核心技术,特别是在操作系统如Linux和Unix中。`pthread-test.rar`这个压缩包显然包含了一些与Linux线程编程相关的示例代码或测试项目,可能是一个用C语言编写的程序,因为C#在Linux...
在Unix/Linux系统中,进程池(Process Pool)是一种高效的进程管理机制,广泛应用于服务器和后台服务,例如银行系统。进程池的基本思想是预先创建一组进程,这些进程在池中待命,等待处理到来的任务,而不是每次有新...