Linux c 线程属性,线程优先级的修改

发布时间:2018-07-19 10:24,

浏览次数:1290

, 标签:

Linux

线程属性的设置,网上找的文章总感觉不够全面,还是结合man手册查看。

线程属性设置,分两个方式,一种是在创建之前,通过pthread_attr_t

结构体传入,另一种,是线程创建完已经在运行时,通过部分函数设置。一般常见的是创建线程时传NULL,使用默认属性,后续运行时根据需要动态修改,也就第二种方式。

一:线程创建前设置属性:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,

void *(*start_routine) (void *), void *arg);

1.0 第一个参数,用来保存创建好后线程uid

2.0 第二个参数,即线程属性,通常传NULL,表示默认属性,这个属性在创建前可以设置,包括调度策略,栈大小,优先级等等

3.0 第三个参数,即线程入口函数

4.0 第四个参数,传给线程的参数

所以在创建线程前,对 第二个参数 pthred_attr_t 结构体进pthread_attr_t 进行赋值

1.0 pthread_attr_init(pthread_attr_t *attr);//使用默认值填充初始化

2.0//获取设置栈大小 //这个属性只能在线程创建前设置,后面不能动态修改了

int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);

int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);

3.0 //设置获取调度策略

SCHED_FIFO, SCHED_RR, and

SCHED_OTHER //policy支持这三种值,

1.0SCHED_OTHER 分时调度策略,

2.0SCHED_FIFO实时调度策略,先到先服务

3.0,SCHED_RR实时调度策略,时间片轮转

SCHED_OTHER(分时调度)是不支持优先级使用的,其他两个实时调度可以

int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);

int pthread_attr_getschedpolicy(pthread_attr_t *attr, int *policy);

4.0 //设置调度参数,目前这个参数里面就一个量,优先级 //用户程序设置实时任务这个优先级,值越大,优先级越高

(内核里面优先级是用另外的一个值,具体查看这个文章:

http://www.360doc.com/content/13/0801/09/7775902_303961368.shtml

)

struct sched_param {

int sched_priority; /* Scheduling priority */

};

int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param

*param);

int pthread_attr_getschedparam(pthread_attr_t *attr,struct sched_param *param);

5.0//是否分离属性

int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);

int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);

上面这些都是静态,在创建线程之前的设置。

二:一般,都在线程创建完后,动态地设置:

1.0 设置调度策略和优先级

#include

int sched_setscheduler(pid_t pid, int policy, const struct sched_param *param);

int sched_getscheduler(pid_t pid); //获取线程当前优先级

struct sched_param {

int sched_priority;

};

//获取支持的最大最小值

int sched_get_priority_max(int policy);

int sched_get_priority_min(int policy);

2.0 设置分离属性

int pthread_detach(pthread_t thread);

int pthread_join(pthread_t thread, void **retval);

3.0 设置线程名称

调用   prctl(PR_SET_NAME, “my_threadname”);

线程默认名称,貌似是父进程的名称,未去考究,在linux上我们用 ps -p pid -T 来查看进程号为

pid的子线程的情况,如果用上面的方式设置了线程名称,则会列出名称

关于 prctl

process control,  #man prctl 上面的是 (2),说明这是一个系统调用函数,根据他的全名顾名思义就是用来控制

process的,(linux内核里面的实现,线程其实就是进程,只是对进行了一些资源的共享,所以经常说线程是轻量级的进程)

关于ps 命令, -p 表示进程号,

-T表示列出子线程。所以上面设置线程名称,更多的时用来调试多线程程序的时候方便调试的,毕竟在程序里面直接用线程pid就可以唯一确定线程的身份了,但是没有名称看的直接,比如没有设置名称的线程:

看一下man手册里面详细的关于PR_SET_NAME的介绍

名称长度不能超过 16bytes(包含 结束符号'\0'),也可以通过库函数 pthread_setname_np来调用,线程的这个属性,可以通过

/proc文件系统来查看,即/proc/self/task/[tid]/comm

linux内核线程优先级设置,Linux c 线程属性,线程优先级的修改相关推荐

  1. Linux内核开发_1_编译LInux内核

    目录 1. 准备工作 1.1 学习环境 1.2 下载Linux内核源码 1.3 解压Linux内核 1.4 目录结构介绍 2. Linux内核配置 2.1 配置选项 1. make config 2. ...

  2. Linux内核入门-如何获取Linux内核源代码、生成配置内核

    如何获取Linux内核源代码 如何获取Linux内核源代码 下载Linux内核当然要去官方网站了,网站提供了两种文件下载,一种是完整的Linux内核,另一种是内核增量补丁,它们都是tar归档压缩包.除 ...

  3. linux内核启动分析 三,Linux内核分析 实验三:跟踪分析Linux内核的启动过程

    贺邦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 一. 实验过程 ...

  4. 查看linux内核的编译时间,linux内核编译步骤

    linux内核编译步骤 对于linux新手来说,编译内核相对有一些难度,甚至不知道如何入手,我通过在网上收集这方面的资料,最终编译成功.现在我归纳了一下,写出这一篇还算比较详细的步骤,希望能对各位新手 ...

  5. 【Linux 内核】调度器 ⑨ ( Linux 内核调度策略 | SCHED_NORMAL 策略 | SCHED_FIFO 策略 | SCHED_NORMAL 策略 | SCHED_BATCH策略 )

    文章目录 一.Linux 内核调度策略源码 二.SCHED_NORMAL 策略 三.SCHED_FIFO 策略 四.SCHED_NORMAL 策略 五.SCHED_BATCH 策略 六.SCHED_I ...

  6. 【Linux 内核 内存管理】Linux 内核堆内存管理 ① ( 堆内存管理 | 内存描述符 mm_struct 结构体 | mm_struct 结构体中的 start_brk、brk 成员 )

    文章目录 一.堆内存管理 二.内存描述符 mm_struct 结构体 三.mm_struct 结构体中的 start_brk.brk 成员 一.堆内存管理 Linux 操作系统中的 " 堆内 ...

  7. 【Linux 内核】进程管理 ( Linux 内核中的进程状态 | TASK_RUNNING | TASK_INTERRUPTIBLE | __TASK_STOPPED | EXIT_ZOMBIE )

    文章目录 一.Linux 内核中的进程状态 二.TASK_RUNNING 状态 三.TASK_RUNNING 状态 四.TASK_UNINTERRUPTIBLE 状态 五.__TASK_STOPPED ...

  8. linux内核学习之三:linux中的32位与64位

    linux内核学习之三:linux中的"32位"与"64位" 在通用PC领域,不论是windows还是linux界,我们都会经常听到"32位" ...

  9. 一文了解linux内核,一文了解Linux的系统结构

    什么是 Linux ? 如果你以前从未接触过Linux,可能就不清楚为什么会有这么多不同的Linux发行版.在查看Linux软件包时,你肯定被发行版.LiveCD和GNU之类的术语搞晕过.初次进入Li ...

  10. 在win10查看本机linux的文件,Windows 10变身开发者利器:内置Linux内核,轻松查看Linux子系统文件...

    原标题:Windows 10变身开发者利器:内置Linux内核,轻松查看Linux子系统文件 来源:创事记 终于!在Windows里可以访问Linux文件了. 这表明,微软插入开源界的触角,越来越深入 ...

最新文章

  1. python 2: 解决python中的plot函数的图例legend不能显示中文问题
  2. (转)软件开发人员如何提高自己的软件专业技术方面的具体建议
  3. Git 分支 - rebase 变基
  4. java 数组 反射_【译】10. Java反射——数组
  5. PHP5异常处理,PHP5异常处理分析实例
  6. 查看IIS日志 各大搜索引擎是否访问网站
  7. .NET图像处理包 DotImage
  8. unistd.h中定义函数
  9. 四个简单的步骤告别烦人的flash广告
  10. win7 企业版 kms 批量激活 简单配置.
  11. 电子设计教程21:晶体管差分放大电路
  12. 从微盟员工删库跑路看程序员的职业素养。
  13. (三)Spring整合RabbitMQSpringBoot 整合RabbitMQRabbitMQ 镜像队列
  14. 如何连接手机和电脑,用电脑控制安卓手机
  15. 16秋南开计算机应用答案,南开16秋学期“计算机应用基础”在线作业.doc
  16. 【 MES】 MES的另一视角
  17. ACM大一练习赛-第三场------G - EPR悖论克鲁斯卡尔算法
  18. Android 下拉刷新框架实现
  19. 「DNS」和「CDN」
  20. Openwrt chaos_calmer 版本在Ubuntu18上编译问题汇总

热门文章

  1. java责任链模式_java中责任链模式详解和使用方法
  2. 关于制作调查问卷的讨论
  3. python func函数用法_Python常见内置高效率函数用法示例
  4. Lammps之漫谈自由能
  5. TeamViewer如何解除5分钟限制和检测为商业用途
  6. java callable接口_Java Callable接口实现细节详解
  7. c语言中的语义错误和语法错误,C语言程序中对错误的调试
  8. 让浏览器自动化完成我们的需求
  9. 【C语言】如何茫茫人海中找出总分最高的学生
  10. 51单片机过时了?为什么还有人学51呢?陈老师为你解答