我正在Linux环境中开发。假设我有3个线程,t1,t2和t3在我的软件中运行(使用pthread实现)。没有交织的线程t1和t2的执行时间范围从50ms到100ms。无论如何,我可以实现线程t3,这样它将每隔30ms发出一次中断(即在t3完成执行[sched_yeild()]之后,下一次运行将在30ms后从该点开始,当30ms超时时,它将产生无论它运行什么线程并运行线程t3直到它完成[sched_yeild()])?以下是我的代码结构:
#include <pthread.h>
#include <sched.h>
//others header files
void* thread1(void *){
while(1){
//code for thread1 :loop time about 50ms-100ms
sched_yield();
}
}
void* thread2(void *){
while(1){
//code for thread2:loop time about 50ms-100ms
sched_yield();
}
}
void* thread3(void *){
while(1){
//code for thread3
sched_yield();
}
}
int main(){
pthread_t t1,t2,t3;
pthread_create(&t1,NULL,thread1,NULL);
pthread_create(&t2,NULL,thread2,NULL);
pthread_create(&t3,NULL,thread3,NULL);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
pthread_join(t3,NULL);
return 0;
}
答案 0 :(得分:1)
你可以让T3以高优先级运行(例如通过sched_setscheduler(0,SCHED_RR,...),你可以让T3在循环中运行,调用usleep()来休眠一段时间,然后当usleep()返回时,T3可以在再次调用usleep()之前做一些有用的事情。如果你想变得聪明,你甚至可以让T3改变传递给usleep()的值以弥补T3花费的时间(做某事) usleep()之间调用纠正漂移,使(有用的东西)更接近每30mS(平均)一次。
但是,如果你希望T3的行为以某种方式控制T1和T2执行的方式/时间,你会感到失望。默认情况下,线程本质上相互异步(并且不可预测)执行,并且仅仅因为T3在给定时刻运行并不意味着T1和T2也不会在同一时刻运行(想想多核/多处理器)。
如果您尝试同步线程的执行,则需要使用正确的线程同步机制,例如互斥锁或条件变量。真的没有替代品。 :)