Chinaunix

标题: 请教与SCHED_FIFO的线程调度策略有关的问题 [打印本页]

作者: yourbabyface    时间: 2008-07-22 17:19
标题: 请教与SCHED_FIFO的线程调度策略有关的问题
首先用pthread_attr_setschedpolicy()设置了2个attr,
其中attr1采用SCHED_OTHER策略,attr2采用SCHED_FIFO策略。
然后
    pthread_create(&thread[0], &attr1, thread1, NULL);
      pthread_create(&thread[1], &attr2, thread2, NULL);
创建了2个线程thread1和thread2。
先让thread1睡眠1ms。thread2执行。1ms后thread1被唤醒,但是前面已经把它设置为SCHED_OTHER了,而此时thread2尚未执行完毕,且thread2为SCHED_FIFO,这时按说thread2应该继续执行,直到自己执行完之后,thread1才得以执行。但是实验结果却是thread1被唤醒之后立即把thread2抢占了,直到thread1执行完之后才又继续执行thread2~!

从多个地方看到下面这句话:
SCHED_FIFO:不同的进程根据静态优先级进行排队,然后在同一优先级的队列中,谁先准备好运行就先调度谁,并且正在运行的进程不会被终止直到以下情况发生:1.被有更高优先级的进程所强占CPU;2.自己因为资源请求而阻塞;3.自己主动放弃CPU(调用sched_yield)

感觉thread2没有这3种情况之一发生,那请问thread2为什么被thread1给抢先了呢?
谢谢!

=====我的两个线程=====
void *thread1()
{
        usleep(1000);             //先让thread1睡眠1ms
        for (i=0; i < 100; i++)
        {
                printf("thread1 : number = %d  i=%d\n",number,i);
                pthread_mutex_lock(&mut);
                        number++;
                pthread_mutex_unlock(&mut);
     }
        pthread_exit(NULL);
}
void *thread2()
{
        for (i=0; i < 200; i++)
        {
                printf("thread2 : number = %d  i=%d\n",number,i);
                pthread_mutex_lock(&mut);
                        number++;
                pthread_mutex_unlock(&mut);
     }
        pthread_exit(NULL);
}
作者: yourbabyface    时间: 2008-07-23 17:37
又查了好多资料,未果,等待各位指点!
作者: gigabyte    时间: 2008-07-23 17:53
SCHED_OTHER策略具体规则是什么?

thread1的优先级确认《=thread2优先级?
作者: yourbabyface    时间: 2008-07-23 21:57
我的理解是只要是SCHED_FIFO的线程,它的调度优先级必然比SCHED_OTHER的高,至于它的priority只在遵循同样调度策略的线程中才用得到....不知道这么理解对不对,讲解这一部分的资料好象都没交代清楚,倒是讲解线程同步的资料铺天盖地的。

所以,唉,这个问题到底怎么回事呢

[ 本帖最后由 yourbabyface 于 2008-7-24 10:26 编辑 ]




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2