linux中怎么用C语言设置程序优先级

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-07-21
linux c如何调整线程优先级

你好。

在分时系统里应该没什必要吧

setpriority/getpriority,这两个函数描述的是改变进程优先级。

但是在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; //所要设定的线程优先级
};
例:创建优先级为10的线程
pthread_attr_t attr;
struct sched_param param;
pthread_attr_init(&attr);
pthread_attr_setschedpolicy(&attr, SCHED_RR);
param.sched_priority = 10;
pthread_attr_setschedparam(&attr, ¶m);
pthread_create(xxx , &attr , xxx , xxx);
pthread_attr_destroy(&attr);

附:使用的测试程序:
#include
#include
#include
#include
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;
}

编译命令:
#g++ pthread_priority3.c -o pthread_priority3 -lpthread

linu上的c语言优先级和一般的C语言优先级是一样的。
一般是 算术 位 (<<>>)关系 位 逻辑 。这么一个优先级顺序 。

  • 在Linux下用C语言编程
    答:4。守护进程的创建 如果你在DOS时代编写过程序,那么你也许知道在DOS下为了编写一个常驻内存的程序我们要编写多少代码了.相反如果在Linux下编写一个"常驻内存"的程序却是很容易的.我们只要几行代码就可以做到. 实际上由于Linux是多任务操作系统,我们就是不编写代码也可以把一个程序放到后台去执行的.我们...
  • linux下怎么用C语言开发界面程序
    答:选择1:去QT的官方网站,里面提供免费下载,主要下载:如果你只用C的话,下载QT图形开发C的编程库,和开发文档(相当于windows的MSDN),如果你用C++的话,就下载QT图形开发C++的编程库,和开发文档.选择2:去GTK的官方网站,面里面提供免费下载,主要下载:如果你只用C的话,下载GTK图形开发C的编程...
  • [Linux]编写一个简单的C语言程序,编写Makefile文件。
    答:[Linux]编写一个简单的C语言程序,编写Makefile文件。 编写一个简单的C语言程序,编写Makefile文件,并用gdb进行调试。答得好我多给10分。拒绝粘贴复制的答案!... 编写一个简单的C语言程序,编写Makefile文件,并用gdb进行调试。答得好我多给10分。拒绝粘贴复制的答案! 展开  我来答 3个回答 #热议# 网文...
  • Linux中,运行一个C语言程序如何运行
    答:在Linux中,可以使用gcc编译器编译C语言程序,生成可执行文件,并最终执行。具体步骤如下:1、编译。由.c文件生成.o文件,写作:gcc a.c -o a.o -c这个命令可以将a.c编译成a.o。如果存在多个文件,可以逐个编译,即a.c b.c...生成a.o b.o...等。2、链接。由.o文件生成可执行文件,...
  • 怎么在linux上用C语言编程,用什么软件
    答:编译器使用g++ 编辑器使用VI, Emacs 自动化工具使用automake 和Makefile IDE使用Eclipse, Qt, KDevelop等。
  • 如何在linux环境下编辑一个c语言源程序并将其编译为可执行文件?_百度...
    答:再同时按shift和冒号,从键盘输入wq(表示保存并退出)。5.编译该文件 输入指令:cc a.c(cc 是gcc 的缩写)若没有报错则从键盘输入ls查看是否生成了可以执行的文件a.out文件。会发现生成a.out文件 6.执行该文件 使用指令 ./a.out 执行该程序。输出hello world !
  • Linux中怎么用c/c++做开发可视化程序
    答:一般使用Qt (C++)或者 GTK+(C)的库;1.比如Qt,安装Qt库以及Qt Creator,在Qt Creator中编译以下程序 include <QApplication>#include <QMainWindow>int main(int argc, char *argv[]){ QApplication a(argc, argv); QMainWindow *w = new QMainWindow(); a.setActiveWindow(w); w...
  • l谁能帮我写一下? Linux下用gcc 调试一下c语言程序
    答:假定你的c程序名字叫test.c 第一步:编辑,用linux最广泛使用的vi编辑器为例,shell下运行vi test.c进入vi编辑器环境,默认为命令模式,按i或I 或A进入插入模式,这样你可以输入c源程序。输入完毕,检查后按Esc键返回命令模式,再按 shift +:(冒号)键进入底行模式,在底行模式下冒号后边输入wq ...
  • 如何用GCC在linux下编译C语言程序?
    答:在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器,假设我们有下面一个非常简单的源程序(hello.c):int main(int argc,char **argv){ printf("Hello Linux\n");} 要编译这个程序,我们只要在命令行下执行:gcc -o hello hello.c gcc 编译器就会为我们生成一个hello的可执行文件....
  • 在linux下,怎么使用C语言编写程序自动修改网络参数?谢谢~!
    答:你可以调用 系统 system函数,在程序里执行shell,如果想永久生效网路配置,示例如下 system("echo DEVICE=eth0 > /etc/sysconfig/network-scripts/ifcfg-eth0");system("echo ONBOOT=yes >> /etc/sysconfig/network-scripts/ifcfg-eth0");system("echo BOOTPROTO=static >> /etc/sysconfig/network-...