浅谈pthread_setschedparam的使用
int pthread_setschedparam(pthread_t target_thread, int policy, const struct sched_param *param)在多线程开发中经常被使用的,它主要用于设置线程的调用策略和优先级。在介绍它的使用方法之前,我们先简单的介绍一下它的使用参数。
1. target_thread是使用pthread_create所获得的线程ID。
2.线程的调度有三种策略:SCHED_OTHER、SCHED_RR和SCHED_FIFO。Policy用于指明使用哪种策略。下面我们简单的说明一下这三种调度策略。
SCHED_OTHER它是默认的线程分时调度策略,所有的线程的优先级别都是0,线程的调度是通过分时来完成的。简单地说,如果系统使用这种调度策略,程序将无法设置线程的优先级。请注意,这种调度策略也是抢占式的,当高优先级的线程准备运行的时候,当前线程将被抢占并进入等待队列。这种调度策略仅仅决定线程在可运行线程队列中的具有相同优先级的线程的运行次序。
SCHED_FIFO它是一种实时的先进先出调用策略,且只能在超级用户下运行。这种调用策略仅仅被使用于优先级大于0的线程。它意味着,使用SCHED_FIFO的可运行线程将一直抢占使用SCHED_OTHER的运行线程J。此外SCHED_FIFO是一个非分时的简单调度策略,当一个线程变成可运行状态,它将被追加到对应优先级队列的尾部((POSIX 1003.1)。当所有高优先级的线程终止或者阻塞时,它将被运行。对于相同优先级别的线程,按照简单的先进先运行的规则运行。我们考虑一种很坏的情况,如果有若干相同优先级的线程等待执行,然而最早执行的线程无终止或者阻塞动作,那么其他线程是无法执行的,除非当前线程调用如pthread_yield之类的函数,所以在使用SCHED_FIFO的时候要小心处理相同级别线程的动作。
SCHED_RR鉴于SCHED_FIFO调度策略的一些缺点,SCHED_RR对SCHED_FIFO做出了一些增强功能。从实质上看,它还是SCHED_FIFO调用策略。它使用最大运行时间来限制当前进程的运行,当运行时间大于等于最大运行时间的时候,当前线程将被切换并放置于相同优先级队列的最后。这样做的好处是其他具有相同级别的线程能在“自私“线程下执行。
3.param是struct sched_param类型的指针,它仅仅包含一个成员变sched_priority,指明所要设置的静态线程优先级。
到此为止,读者已经基本了解了这个函数的相关知识点,那么如何正确的使用它呢?我们不妨使用一个简单的例子来说明它吧。
int WYQThread_SetPrority( pthread_t tid, int prority )
{
// Check parameters
assert( tid > 0 );
if ( tid <= 0 )
{
printf( “Invalid thread’s id(%ld)\n”, (long) tid );
return EINV;
}
assert(prority >= 0 && prority <= 99 );
if (prority < 0 || prority > 99 )
{
printf( “Invalid thread’s prority(%ld)\n”, (long) prority );
return EINV;
}
// Set thread’s prority
if ( prority != 0 ) // We use SCHED_FIFO or SCHED_RR
{
// Check whether user is root
if ( geteuid() == 0 )
{
struct sched_param sched;
sched.sched_priority = prority;
// We use RR to act as the default scheduler
return pthread_setschedparam( tid, SCHED_RR, &sched );
}
// We don’t support user mode for static prority’s scheduler, so ignore it
}
return 0;
}
上述仅仅是一个简单的例子,主要说明了其中的一些注意点。它有很多改进的地方,比如可以使用虚优先级(在程序中加入虚实影射表)等,我想这些地方就留给大家去完善吧J
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hello_wyq/archive/2007/04/09/1557707.aspx
分享到:
相关推荐
pthread_testcancel pthread_kill pthread_cancel 的使用例子
以下是对pthread_cond_wait的用法进行了详细的分析介绍,需要的朋友可以过来参考下
编译时报 Looking for pthread_create - not found 的解决办法 linux gcc 编译时报Looking for pthread_create - not found 其解决办法是...
信号pthread_cond_wait信号pthread_cond_wait信号pthread_cond_wait信号pthread_cond_wait信号pthread_cond_wait
线程中处理信号pthread_sigmask 的使用
线程编程——使用pthread_join。 打包文件包含两个文件:c文件源代码、Makefile文件,运行环境在Ubuntu14.04下,使用自带的gcc编译器,同学们只需将文件夹复制到某一目录下之后在终端执行:1.“make”生成“test”可...
一篇博客内容 pthread_cond_wait详解
为什么在pthread_cond_wait()前要加一个while循环来判断条件是否为假呢?.zip
问题原因: pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a,所以在使用pthread_create()创建线程,以及调用 pthread_atfork()函数建立fork处理程序时,需要链接该库。 问题解决: 在编译...
线程编程——不使用pthread_join。 打包文件包含两个文件:c文件源代码、Makefile文件,运行环境在Ubuntu14.04下,使用自带的gcc编译器,同学们只需将文件夹复制到某一目录下之后在终端执行:1.“make”生成“test”...
主要介绍pthread_cread() 的介绍,便于自己学习和回顾。 如有错误欢迎指出。
通过配置线程调度策略与优先级,可使各线程按照设定的顺序... pthread_attr_setschedparam(&attr[i], ¶m[i]); // 设置优先级参数 pthread_attr_setinheritsched(&attr[i], PTHREAD_EXPLICIT_SCHED)设置线程属性
PThread header file
头文件 #include <pthread.h> 函数原形 pthread_t pthread_self();
pthread资源包,pthread源码和已经编译好的VS2019_x64版本 #include <pthread.h> pthread_t newThread; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setscope(&attr, PTHREAD_SCOPE_PROCESS); ...
2.2多线程介绍如果不能从根本上更新当前CPU的架构(在很长一段时间内还不太可能),那么继续提高CPU性能的方法就是超线程CPU模式 2.2.1多线程出现的原因
pthread_kill测试,该函数可用来测试某个进程中的线程执行情况
32位android中bionic是32位的,其中的mutex只有一半也就是16位能够存储pid,当通过docker运行android时,大概率pid会超过16位的范围,就可能会导致android中mutex死锁,表现为应用卡住黑屏。 [32-bit ABI bugs]...
pthread编程指南,介绍关于PTHREAD的编程,在Linux下的应用。。
QT中多线程实例,使用C的pthread_create,传递参数,简单易懂,用工程和可执行程序及源代码,仅供参考