pthread设置线程的优先级

pthread_setschedparam 语法

int pthread_setschedparam(pthread_t tid, int policy,const struct sched_param *param);在多线程开发中经常被使用的,它主要用于设置线程的调用策略和优先级。在介绍它的使用方法之前,我们先简单的介绍一下它的使用参数。

1. tid是使用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_RRSCHED_FIFO做出了一些增强功能。从实质上看,它还是SCHED_FIFO调用策略。它使用最大运行时间来限制当前进程的运行,当运行时间大于等于最大运行时间的时候,当前线程将被切换并放置于相同优先级队列的最后。这样做的好处是其他具有相同级别的线程能在“自私“线程下执行。

3.param是struct sched_param类型的指针,它仅仅包含一个成员变sched_priority,指明所要设置的静态线程优先级。

pthread_setschedparam 返回值

pthread_setschedparam() 在成功完成之后返回零。其他任何返回值都表示出现了错误。如果出现以下任一情况,pthread_setschedparam() 函数将失败并返回相应的值。

EINVAL

描述:

所设置属性的值无效。

ENOTSUP

描述:

尝试将该属性设置为不受支持的值。

eg:

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;
}

它有很多改进的地方,比如可以使用虚优先级(在程序中加入虚实影射表)等

原文地址:https://www.cnblogs.com/tianzeng/p/9192706.html

时间: 2024-11-13 09:47:40

pthread设置线程的优先级的相关文章

java 22 - 6 多线程之线程调度和设置线程的优先级

线程调度 假如我们的计算机只有一个 CPU,那么 CPU 在某一个时刻只能执行一条指令,线程只有得到 CPU时间片,也就是使用权,才可以执行指令. 那么Java是如何对线程进行调用的呢? 线程有两种调度模型: 分时调度模型 所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片 抢占式调度模型 优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些. Java使用的是抢占式调度模型. 既然线程设有设置优先级,

三、java多线程核心技术(笔记)——线程的优先级

概论: 在操作系统中,线程可以划分优先级,优先级高的获得的CPU资源较多,也就是CPU优先执行优先级较高的线程.在JAVA中线程的优先级 分1~~10个10个等级.大于或者小于会报异常. 一.线程优先级具有继承性 A 线程启动 B线程,则线程B的优先级与A的是一样的.. public class MyThread1 extends Thread { @Override public void run() { System.out.println("MyThread1 run priority=&

java 多线程4: java线程的优先级

Java线程的优先级取值范围是1 (Thread.MIN_PRIORITY ) 到 10 (Thread.MAX_PRIORITY ).如果没有设置, 线程默认的优先级是NORM_PRIORITY.这个值是5. getPriority()和setPriority(int newPriority) 是实例方法 这两个方法用于获取和设置线程的优先级,优先级高的CPU得到的CPU资源比较多,设置优先级有助于帮"线程规划器"确定下一次选择哪一个线程优先执行.换句话说,两个在等待CPU的线程,优

第18章 多线程----线程的优先级

每个线程都具有各自的优先级,线程的优先级可以表明在程序中该线程的重要性,如果有很多线程处于就绪状态,系统会根据优先级来决定使哪个线程进入运行状态.每个新产生的线程都继承了父线程的优先级. 例如:在项目中创建PriorityTest类,该类实现了Runnable接口.创建4个进度条,分别由4个线程来控制,并且为这4个线程设置不同的优先级. import java.awt.*; import javax.swing.*; public class PriorityTest extends JFram

C#的线程类之Thread类以及对为什么设置线程优先级却不先执行这一问题本身的认识

1.C#对线程进行操作时,通过Thread类,可以对线程进行创建.挂起.恢复.休眠.终止及设置优先级. Thread类位于System.Threading命名空间下,该命名空间还包含一个ThreadPool类(允许用户使用系统提供的线程池)和一个Timer类(在线程池上执行回调方法) 在线程运行期间,不同的时刻会表现为不同的状态,但它总是处于由ThreadState定义的一个或多个状态中.用户可以通过使用ThreadPriority枚举为线程定义优先级,但不能保证操系统会接收该优先级 2.Thr

ceSetThreadPriority设置线程优先级~!

ceSetThreadPriority 一直采用SetThreadPriority,结果今天发帖询问线程时间问题,才突然顿悟...发现SetThreadPriority仅仅设置248-255,也就是说就算是设为最高优先级,顶多是248....差好远呢...而ceSetThreadPriority的设置范围是0-255,最高为0!!!我就说我的线程设置的优先级怎么没什么用......NYYD... 初始化代码中的关键 Win32 API 调用是对 CeSetThreadPriority 的调用.此

Java多线程-线程调度及获取和设置线程优先级

线程有两种调度模型:1.分时调度模型 所有线程轮流使用CPU的使用权,平均分配给每个线程占用CPU的时间片.2.抢占式调度模型 优先让给线程高的线程使用CPU,如果线程的优先级相同,那么随机选择一个,优先级高的线程获取的CPU的时间片相对多一些. Java使用的是抢占式调度模型 查阅API常用方法: public final int getPriority() 返回线程的优先级. 默认线程优先级为5 public final void setPriority(int newPriority)更改

Java 并发 线程的优先级

Java 并发 线程的优先级 @author ixenos 低优先级线程的执行时刻 1.在任意时刻,当有多个线程处于可运行状态时,运行系统总是挑选一个优先级最高的线程执行,只有当线程停止.退出或者由于某些原因不执行的时候,低优先级的线程才可能被执行 2.两个优先级相同的线程同时等待执行时,那么运行系统会以round-robin的方式选择一个线程执行(即轮询调度,以该算法所定的)(Java的优先级策略是抢占式调度!) 3.被选中的线程可因为一下原因退出,而给其他线程执行的机会: 1) 一个更高优先

基于pthread的线程池实现

最近在做项目的过程中,需要使用线程池来实现任务的异步处理.即线程池中包含提前创建好的线程,客户将任务提交到线程池中,线程池中的线程对任务进行获取并执行.针对项目所使用的pthread线程库,我们设计与实现了一个简单的线程池. 在介绍线程池的实现之前,首先整理一下pthread库的一些接口.pthread是由POSIX提出的线程实现,广泛地被各种unix平台所支持.创建线程的接口为 pthread_create(pthread_t* thread, const pthread_attr_t* at