gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:13:07 26 4
gpt4 key购买 nike

我正在 Linux 环境中开发。假设我有 3 个线程,t1、t2 和 t3 在我的软件中运行(使用 pthread 实现)。没有交织的线程 t1 和 t2 的执行时间在 50ms 到 100ms 之间。无论如何,我可以实现线程 t3,使其每 30 毫秒发出一次中断(即在 t3 完成执行后 [sched_yeild()],下一次运行将在 30 毫秒后从该点开始,当 30 毫秒超时时,它将产生无论它正在运行什么线程并运行线程 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() 调用之间校正漂移,因此(有用的东西)几乎每 30 毫秒(平均)发生一次。

但是,如果您希望 T3 的行为以某种方式控制 T1 和 T2 的执行方式/时间,您会失望的。默认情况下,线程本质上相互异步执行(且不可预测),仅仅因为 T3 在给定时刻运行并不意味着 T1 和 T2 不在同一时刻运行(想想多核/多处理器)。

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

关于多线程程序的C++定时器中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47783879/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com