当前位置: 首页 > news >正文

Linux-pthread如何设置线程的优先级

设置线程优先级的函数:

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. paramstruct sched_param类型的指针,它仅仅包含一个成员变sched_priority,指明所要设置的静态线程优先级。

设置线程优先级的代码例子:

#ifdef HAVE_SCHED_H
#include <sched.h>
#endif
 
void setCurrentThreadHighPriority(bool value) {
  // Start out with a standard, low-priority setup for the sched params.
  struct sched_param sp;
  bzero((void*)&sp, sizeof(sp));
  int policy = SCHED_OTHER;
 
  // If desired, set up high-priority sched params structure.
  if (value) {
    // FIFO scheduler, ranked above default SCHED_OTHER queue
    policy = SCHED_FIFO;
    // The priority only compares us to other SCHED_FIFO threads, so we
    // just pick a random priority halfway between min & max.
    const int priority = (sched_get_priority_max(policy) + sched_get_priority_min(policy)) / 2;
 
    sp.sched_priority = priority;
  }
 
  // Actually set the sched params for the current thread.
  if (0 == pthread_setschedparam(pthread_self(), policy, &sp)) {
    printf("IO Thread #%d using high-priority scheduler!", pthread_self());
  }
}

相关文章:

  • Qt系列文章之一(Qt 下载、安装,组件管理软件​储存库设置,离线/在线安装方式)
  • Qt系列文章之二(Qt 环境搭建,主要针对MSVC/Android 平台)
  • Qt系列文章之三(编写简单程序Hello world 到不同平台winPc/Android)
  • Qt系列文章之四(如何在visual Studio 里使用Qt)
  • Qt系列文章之五(QtCreator 里使用Qt 技巧)
  • Qt系列文章之六(Qt 元对象系统介绍)
  • Qt系列文章之七(Qt 属性系统介绍)
  • Qt系列文章之八(Qt 信号和槽使用)
  • Qt系列文章之九(Qt 数据类型介绍以及迭代器使用上)
  • Qt系列文章之十(Qt 数据类型介绍以及迭代器使用下)
  • Qt系列文章之十一 (Qt 相关模块介绍)
  • Qt系列文章之十二(网络编程初体验)
  • Qt系列文章之十三(QTCP通信概述)
  • Qt系列文章之十四 (基于QTcpServer TCP服务器端程序设计)
  • Qt系列文章之十五 (基于QTcpSocket TCP客户端程序设计及通信演示)
  • hexo+github搭建个人博客
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Brief introduction of how to 'Call, Apply and Bind'
  • Docker容器管理
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • Hexo+码云+git快速搭建免费的静态Blog
  • JavaScript设计模式之工厂模式
  • JavaScript中的对象个人分享
  • java概述
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • spring boot 整合mybatis 无法输出sql的问题
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 工作中总结前端开发流程--vue项目
  • 诡异!React stopPropagation失灵
  • 机器学习学习笔记一
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 力扣(LeetCode)965
  • 每天10道Java面试题,跟我走,offer有!
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 模型微调
  • 浅谈Golang中select的用法
  • 使用 @font-face
  • 算法之不定期更新(一)(2018-04-12)
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • #{}和${}的区别?
  • #android不同版本废弃api,新api。
  • (分类)KNN算法- 参数调优
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (一)u-boot-nand.bin的下载
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)Scala的“=”符号简介
  • (转)大道至简,职场上做人做事做管理
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .form文件_SSM框架文件上传篇
  • .libPaths()设置包加载目录
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET Core 实现 Redis 批量查询指定格式的Key