2017-12-13 27 views
0

Ich entwickle in einer Linux-Umgebung. Nehmen wir an, ich habe 3 Threads, t1, t2 und t3, die in meiner Software laufen (implementiert mit pthread). Die Ausführungszeit von Thread t1 und t2 ohne Interleaving liegt zwischen 50 ms und 100 ms. Kann ich Thread t3 trotzdem so implementieren, dass er alle 30ms einen Interrupt ausgibt (dh nach t3 abgeschlossener Ausführung [sched_yeild()]), wird der nächste Lauf 30ms später ab diesem Zeitpunkt ausgeführt und nach Ablauf der Zeit von 30ms wird er nachgeben welchen Thread es auch ausführt und führe Thread t3 aus, bis er fertig ist [sched_yeild()])? Unten ist die Struktur meines Code:C++ Timer Interrupt für Multithread-Programm

#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; 
} 
+1

Sie möchten T3 (so nah wie möglich) T1 und T2 sofort vorbestellen und laufen lassen, bis es sich ergibt? Klingt so, als ob du T3 eine höhere Priorität geben möchtest. Aber zählen Sie nicht auf die Synchronisierung. – user4581301

+1

Definieren Sie, was Sie mit "Interrupt" meinen. Der Begriff hat in diesem Zusammenhang viele verschiedene Bedeutungen. Darüber hinaus verstehen Sie, dass 'sched_yield()' keinerlei Garantien bietet, was auch immer tatsächlich passiert. Das klingt wie ein XY-Problem. Ihr wirkliches Problem ist etwas anderes und Sie denken, dass die Lösung das ist, was diese Frage beschreibt. Vielleicht, wenn Sie das wahre Problem beschreiben, kann jemand eine echte Lösung für Sie finden. –

+0

@ user4581301 ja. Die Priorität sollte in diesem Fall nicht funktionieren, da der aktuelle laufende Thread (t1 und t2) immer noch ausgeführt wird und die Ressourcen nicht aufgeben. – user9870

Antwort

1

Sie T3 Lauf mit einer hohen Priorität haben kann (zB über sched_setscheduler (0, SCHED_RR, ...) und Sie können T3 laufen in einer Schleife, die usleep nennt (), um für eine bestimmte Zeit zu schlafen, und dann, wenn usleep() zurückkehrt, kann T3 etwas Nützliches tun, bevor er unsleep() erneut aufruft. Wenn du schlau werden willst, kannst du sogar T3 den Wert verändern,), um die Zeit auszugleichen, die T3 zwischen den usleep() -Aufrufen verbracht hat, um die Drift zu korrigieren, so dass (etwas Nützliches) näherungsweise einmal alle 30 ms (im Durchschnitt) passiert.

Ich hoffe, dass das Verhalten von T3 irgendwie steuert, wie/wann T1 und T2 ausgeführt werden Du wirst enttäuscht sein. Threads führen von Natur aus standardmäßig asynchron (und unvorhersehbar) zueinander aus, und gerade weil T3 zu einem gegebenen Zeitpunkt läuft, heißt das nicht, dass T1 und T2 nicht gleichzeitig im selben Moment laufen (denke Multicore/Multiprozessor).

Wenn Sie versuchen, die Ausführung von Threads zu synchronisieren, müssen Sie einen geeigneten Thread-Synchronisierungsmechanismus verwenden, z. B. eine Mutex- oder eine Bedingungsvariable. Es gibt wirklich keinen Ersatz. :)