Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多线程程序的C++定时器中断_C++_Linux_Multithreading_Pthreads_Interrupt - Fatal编程技术网

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

多线程程序的C++定时器中断,c++,linux,multithreading,pthreads,interrupt,C++,Linux,Multithreading,Pthreads,Interrupt,我正在Linux环境中开发。让我们假设在使用pthread实现的软件中有3个线程,t1、t2和t3。线程t1和t2的执行时间(不交错)在50毫秒到100毫秒之间。我是否可以实现线程t3,使其每30毫秒发出一次中断,即在t3完成执行[sched_yeild]后,下一次运行将在30毫秒后从该点开始,当30毫秒超时时,它将产生它正在运行的任何线程,并运行线程t3,直到它完成[sched_yeild]?以下是我的代码结构: #include <pthread.h> #include <

我正在Linux环境中开发。让我们假设在使用pthread实现的软件中有3个线程,t1、t2和t3。线程t1和t2的执行时间(不交错)在50毫秒到100毫秒之间。我是否可以实现线程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;
}

您可以通过sched_setscheduler0、sched_RR等以高优先级运行T3。。。你可以让T3在一个循环中运行,这个循环调用usleep休眠一段时间,然后当usleep返回时,T3可以在再次调用usleep之前做一些有用的事情。如果你想变得聪明,你甚至可以让T3改变它传递给usleep的值,以弥补T3在usleep调用之间做一些有用的事情来纠正漂移的时间,这样有用的事情平均每30毫秒发生一次

然而,如果你希望T3的行为能以某种方式控制T1和T2的执行方式/时间,你会失望的。默认情况下,线程本质上是异步执行的,彼此之间的执行是不可预测的,仅仅因为T3在给定时刻运行并不意味着T1和T2也不在同一时刻运行,比如多核/多处理器


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

你想让T3尽可能靠近,立即抢占T1和T2并运行直到它投降?听起来你想给T3更高的优先级。但同步时不要指望这一点。定义一下你所说的中断是什么意思。在这种情况下,该术语有许多不同的含义。此外,您确实了解sched_收益率不提供任何形式的保证,不管实际发生了什么。这听起来像是个XY问题。你真正的问题是别的,你认为解决办法就是这个问题所描述的。如果你描述了真正的问题,也许有人能为你想出一个真正的解决方案。@user4581301是的。在这种情况下,优先级不应该起作用,因为当前正在运行的线程t1和t2仍在执行,并且没有放弃资源。@SamVarshavchik很抱歉不清楚。在此上下文中,我的意思是,每当30ms计时器超时时,它都会发出一个信号,任何正在运行的线程都会放弃CPU资源抢占,让T3立即运行T3有点像中断服务例程。我的实际问题是,我正在从线程T3捕获图像,我希望有一个固定的帧速率。因此我需要T3以周期性的方式运行。类似这样的东西更类似于实时操作系统,而不是通用的Linux。Linux内核有实时扩展,这取决于您的发行版是否可用。但再一次:这是一个XY问题。无论真正的问题是什么,尝试解决真正的问题,而不是XY问题,更有可能会更有成效。我只想说,Linux操作系统的股票中没有任何东西可以用来保证任何这类的东西。