- 论坛徽章:
- 0
|
首先用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);
} |
|