繁体   English   中英

多线程程序的C ++计时器中断

[英]C++ timer interrupt for multithreaded program

我在Linux环境中进行开发。 假设我的软件中运行着3个线程t1,t2和t3(使用pthread实现)。 线程t1和t2的执行时间(不交织)介于50毫秒至100毫秒之间。 无论如何,我可以实现线程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;
}

您可以让T3以较高的优先级运行(例如通过sched_setscheduler(0,SCHED_RR,...)),并且可以让T3循环运行,该循环调用usleep()睡眠一定时间,然后在usleep( )返回后,T3可以在再次调用usleep()之前做一些有用的事情。如果您想变得更聪明,甚至可以让T3改变传递给usleep()的值来弥补T3在两次之间花费的时间(做一些有用的事情) usleep()调用以校正漂移,以便(有用的东西)每30mS(平均)发生一次。

但是,如果您希望T3的行为能够以某种方式控制T1和T2的执行方式/时间,您将感到失望。 默认情况下,线程就其性质而言彼此之间是异步执行的(并且是不可预测的),并且仅仅因为T3在给定的时刻运行并不意味着T1和T2也不在同一时刻运行(请考虑多核/多处理器)。

如果尝试同步线程的执行,则需要使用适当的线程同步机制,例如互斥或条件变量。 真的没有替代品。 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM