浅谈pthread_setschedparam的使用

54 篇文章 1 订阅

浅谈pthread_setschedparam的使用

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

1. target_thread是使用pthread_create所获得的线程ID

2.线程的调度有三种策略:SCHED_OTHERSCHED_RRSCHED_FIFOPolicy用于指明使用哪种策略。下面我们简单的说明一下这三种调度策略。

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调用策略。它使用最大运行时间来限制当前进程的运行,当运行时间大于等于最大运行时间的时候,当前线程将被切换并放置于相同优先级队列的最后。这样做的好处是其他具有相同级别的线程能在“自私“线程下执行。

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

 

到此为止,读者已经基本了解了这个函数的相关知识点,那么如何正确的使用它呢?我们不妨使用一个简单的例子来说明它吧。

 

int WYQThread_SetPrority( pthread_t tid, int prority )

{

// Check parameters

assert( tid > 0 );

if ( tid <= 0 )

{

    printf( Invalid threads id(%ld)/n, (long) tid );

    return EINV;

}

assert(prority >= 0 && prority <= 99 );

if (prority < 0 || prority > 99 )

{

    printf( Invalid threads prority(%ld)/n, (long) prority );

    return EINV;

}

 

// Set threads 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 dont support user mode for static proritys scheduler, so ignore it

}

 

return 0;

}

上述仅仅是一个简单的例子,主要说明了其中的一些注意点。它有很多改进的地方,比如可以使用虚优先级(在程序中加入虚实影射表)等,我想这些地方就留给大家去完善吧J

 
  • 2
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值