首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

请问一个线程优先级的有关问题

2012-02-23 
请教一个线程优先级的问题小弟新学不久,刚刚遇到一个线程优先级的问题,我想强行设定两个线程的优先级,可是

请教一个线程优先级的问题
小弟新学不久,刚刚遇到一个线程优先级的问题,我想强行设定两个线程的优先级,可是运行时两个线程并没有按照顺序出现,程序如下:

#include   <stdio.h>
#include   <pthread.h>
#include   <sched.h>

typedef   struct
{
      int   a;
      int   b;
      int   d;
}   app_data;


void   *thread_ex   (void   *data)
{
      int   count   =   1;
      app_data   *td   =   (app_data*)   data;
      while   (count   <=   td-> b)
      {
            printf   ( "Thread   %d,   Iteration   %d\n ",   td-> a,   count);
            count++;
            sleep(td-> d);  
      }
      printf   ( "Thread   %d   terminated\n ",   td-> a);
      return   0;
}


main()
{
      pthread_t   th1,   th2;
      app_data   td1   =   {1,10,2};
      app_data   td2   =   {2,5,3};

      pthread_attr_t   attr;

      struct   sched_param   param1   =   {1};
      struct   sched_param   param2   =   {99};

      void   *retval;
     
      pthread_attr_init(&attr);      
       

      pthread_attr_setschedpolicy(&attr,SCHED_RR);
     
   
      pthread_attr_setschedparam(&attr,&param1);      
      pthread_create   (&th1,   &attr,   thread_ex,   &td1);

      pthread_attr_setschedparam(&attr,&param2);
      pthread_create   (&th2,   &attr,   thread_ex,   &td2);

      pthread_join   (th1,   &retval);
      pthread_join   (th2,   &retval);
      printf   ( "Main   terminated\n ");
}

我理想应该是:

Thread   1,   Iteration   1
Thread   1,   Iteration   2
Thread   1,   Iteration   3
...
Thread   2,   Iteration   1
Thread   2,   Iteration   2
...
Main   terminated

请问怎么样才能实现,我的程序有什么问题?谢谢指教!!!

[解决办法]
可以考虑使用类似pthread_cond_wait之类的线程间通信机制
[解决办法]
Pthread 调度
POSIX 定义一种优先级调度模型,此模型确定任何两个线程相对于对方的重要程度。 每当有一个以上的线程可以运行—执行就绪—时,系统都将选择具有最高优先级的线程。

POSIX 线程调度语义是按照一种概念模型定义的,在此概念模型中有一个有效优先级范围,并且有一组线程列表,每个优先级分配有一个列表。根据线程的调度优先级,将任何可运行的线程放置在其中一个线程列表上。线程列表内的排序取决于调度策略。因此,每个线程都受其调度优先级及其调度策略控制。

调度策略的作用是定义这些线程列表上的操作,如在列表内和列表之间移动线程。 不管策略如何,POSIX 都指定具有最高优先级的线程列表中的第一个线程应为当前运行的线程。

调度线程优先级的能力是 POSIX 标准中的一个选项,由符号 POSIX_THREAD_PRIORITY_SCHEDULING 指定。支持此选项的 POSIX 实现还必须提供给线程指定实时调度策略和优先级的机制。 强制性策略为 SCHED_FIFO、SCHED_RR 和 SCHED_OTHER。

SCHED_FIFO(先进先出)策略按线程在执行前在列表上存在的时间对列表上的线程进行排序。处于列表首位的线程通常为在列表上存在时间最长的线程,而处于末尾的线程在列表上存在的时间最短。此策略允许一个线程一直运行,直到具有较高优先级的另一个线程已准备好运行,或者直到当前线程自动阻止。如果此线程被占据,它就继续处于其线程优先级列表的首位;如果此线程阻止,当它再次成为一个可运行的线程时,将被添加到此线程所在的优先级列表的末尾。



SCHED_RR (循环法)策略与 SCHED_FIFO 策略相同,不同的只是运行的线程在被占据之前只能运行有限的时间长度。当超过此固定时限时,运行的线程就被放到线程优先级列表的末尾,而现在处于列表首位的线程将成为运行的线程。 此策略的作用是确保具有相同优先级的多个 SCHED_RR 线程能共享处理器。

SCHED_OTHER 策略是针对具体实现的,相容的 POSIX 实现必须记录此策略的行为。 一个实施可将此策略定义为与 SCHED_FIFO 或 SCHED_RR 相同,也可以定义为与这两种策略完全不同的策略。 POSIX 定义此类策略的目的是为相容的程序提供一种方法来表明这些程序不需要可移植的实时调度策略。

每种调度策略都有一个优先级的有效范围;对于 SCHED_FIFO 和 SCHED_RR,此范围必须至少是 32,而对于 SCHED_OTHER,此范围是针对具体实现的。 可以从 sched_get_priority_min() 函数和 sched_get_priority_max() 函数确定优先级的范围。

PThread 调度争用范围和分配域
除线程调度策略和线程优先级外,还有其他两种调度控制: 线程调度争用范围和线程调度分配域。

争用范围定义竞争使用处理资源的线程集。 POSIX 定义两个争用范围:系统中的所有线程(或 PTHREAD_SCOPE_SYSTEM)以及一个进程中的所有线程(或 PTHREAD_SCOPE_PROCESS)。

系统争用范围中的一个线程与系统中所有其他线程(包含其他进程中的那些线程)争用资源。 一个进程中的高优先级线程可阻止其他进程中的系统争用范围线程运行。

进程争用范围内的线程在进程内进行调度,这表示只在一个进程内的所有线程间进行调度。 进程争用范围通常表示由操作系统选择要运行的进程,而进程本身包含一个内部调度程序来试图针对进程内的线程实现 POSIX 调度规则。
[解决办法]
本来就是并发进行的
控制线程不能依赖优先级
优先级只是给予线程更多的时间片的有限调度的权力
[解决办法]
这里不存在互斥吧,不是有td1,td2么
[解决办法]
"调度程序运行时,要在所有可运行状态的进程中选择最值得运行的进程投入运行。选择进程的依据是什么呢?在每个进程的task_struct结构中有以下四项:policy、priority、counter、rt_priority。这四项是选择进程的依据。其中,policy是进程的调度策略,用来区分实时进程和普通进程,实时进程优先于普通进程运行;priority是进程(包括实时和普通)的静态优先级;counter是进程剩余的时间片,它的起始值就是priority的值;由于counter在后面计算一个处于稍诵凶刺慕讨档迷诵械某潭萭oodness时起重要作用,因此,counter也可以看作是进程的动态优先级。rt_priority是实时进程特有的,用于实时进程间的选择。
Linux用函数goodness()来衡量一个处于可运行状态的进程值得运行的程度。该函数综合了以上提到的四项,还结合了一些其他的因素,给每个处于可运行状态的进程赋予一个权值(weight),调度程序以这个权值作为选择进程的唯一依据。 "

也就是说你赋予的优先级只对priority起作用,而且你可以使用的优先级在0~20之间.而实际上调度是计算的优先级并不完全由priority决定,所以程序并不按你设定的方式运行.

热点排行