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