LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 854|回复: 1

Linux下如何对线程进行调度?

[复制链接]
发表于 2005-6-15 20:35:03 | 显示全部楼层 |阅读模式
我在linux下编写多线程程序,并为每个线程设置了不同的优先级,但线程执行却始终是按照创建的先后顺序执行的。为什么高优先级不能先执行完毕呢?

程序如下:
/* example.c*/
//创建多线程,设置线程属性,优先级及互斥量的设定。

#include <errno.h>
#include <pthread.h>
#include <sched.h>
#include <stdio.h>
#include <unistd.h>
#include <asm/unistd.h>
#include <linux/unistd.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>

#include <stdlib.h>

static inline _syscall0(int ,gettid);

pthread_mutex_t mutex;

void thread(int *counter)
{
    int i,j;
    float x,y;
    x=1.0;
    y=2.0;
          for(i=0;i< 10;i++)
        {
            printf("This is a  %d pthread.counter is :%d\n",gettid(), counter);
           for  (j=0;j<10000000;j++)  //延时
           {
               x*y;
           }
   
           }
    printf("child end\n ");
   
}

int create_rt_thread( pthread_t *id ,void *func , void *func_para , int
prior )
{
  int ret;
  pthread_attr_t attr;
  /*初始化属性值,均设为默认值*/
  pthread_attr_init(&attr);
  pthread_attr_setscope(&attr, PTHREAD_SCOPE_PROCESS);
  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

  //设置优先级
  struct sched_param param;
  int newprio=prior;
  pthread_attr_init(&attr);
  pthread_attr_getschedparam(&attr, &param);
  param.sched_priority=prior;

//  printf(" %d\n",param.sched_priority);
  //param.rt_priority=newprio;
  pthread_attr_setschedparam(&attr, &param);
// pthread_attr_setsinheritsched(&attr,PTHREAD_EXPLICIT_SCHED);
//pthread_attr_setschedpolicy(&attr,SCHED_RR);
  //定义互斥量
  //pthread_mutex_init (&mutex,NULL);
  
  ret=pthread_create(id,&attr,(void *) thread,func_para);
  param.sched_priority=prior;
  pthread_setschedparam(*id, SCHED_RR, &param);

  if(ret!=0)
    {
      printf ("Create pthread error!\n");
      exit (1);
      }
  // pthread_join(id,NULL);
    return ret;
}

int main(void)
{
   pthread_t id[10];
   int ret,i;
   struct sched_param param;
   pthread_setschedparam(pthread_self(), SCHED_RR, &param);
   for(i=0;i<10;i++)
    {
      ret=create_rt_thread(&id,(void *)thread,(void *)i , i*3+2);
      
      }
    for (i=0;i<10;i++)
        {
          pthread_join(id,NULL);
        }
   
     printf(" main end ");
     return (0);
}
发表于 2005-6-16 10:16:07 | 显示全部楼层
你没有采用sleep(1)让调度器发挥作用,试试每个thread函数前加sleep(1),否则内核无法调度。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表