2011-01-04 12 views
1

Ich habe eine Funktion say void *WorkerThread (void *ptr).Wie führe ich den Thread in der Hauptfunktion unendlich, ohne dass das Programm beendet wird?

Die Funktion *WorkerThread(void *ptr) Endlosschleife hat, der liest und kontinuierlich von der seriellen Schnittstelle

Beispiel

void *WorkerThread(void *ptr) 
{ 
while(1) 
    { 
    // READS AND WRITE from Serial Port USING MUXTEX_LOCK AND MUTEX_UNLOCK 


    } //while ends 

}  

Die andere Funktion I worte ist ThreadTest Beispiel

int ThreadTest() 
{ 
    pthread_t Worker; 
    int iret1; 
    pthread_mutex_init(&stop_mutex, NULL); 
    if(iret1 = pthread_create(&Worker, NULL, WorkerThread, NULL) == 0) 
    { 
    pthread_mutex_lock(&stop_mutex); 
    stopThread = true; 
    pthread_mutex_unlock(&stop_mutex); 
    } 

if (stopThread != false) 
    stopThread = false; 
pthread_mutex_destroy(&stop_mutex); 

return 0;  
}  

In main Funktion
schreibt Ich habe so etwas wie

int main(int argc, char **argv) 
{ 

    fd = OpenSerialPort(); 
    if(ConfigurePort(fd) < 0) return 0; 

    while (true) 
    { 

     ThreadTest(); 
    } 
return 0; 
} 

Nun, wenn ich diese Art von Code mit Debug-Anweisung ausführen es läuft für einige Stunden in Ordnung und dann Nachricht werfen wie „kann nicht in der Lage Thread zu erstellen“ und Anwendung beendet wird. Hat jemand eine Idee, wo ich Fehler mache? Auch wenn es eine Möglichkeit gibt ThreadTest in main mit while(true) auszuführen, da ich bereits while(1) in ThreadWorker verwende, um unendlich zu lesen und zu schreiben. Alle Kommentare und Kritik sind willkommen. Danke & Grüße, SamPrat.

+0

Bitte bearbeiten, so dass alle Ihre Code in einem Code-Umgebung (4 Räume am Anfang). – RedX

+0

@RedX -> Ich habe den Abstand wieder gemacht. Danke für das Zeigen – samprat

Antwort

0

Sieht so aus, als hätten Sie nicht pthread_join() aufgerufen, was den Status bereinigt, nachdem die non-detached Threads beendet sind. Ich würde spekulieren, dass Sie hier ein Limit pro Prozess-Ressource erreicht haben.

Wie andere bemerkt haben, ist das kein großartiges Design - warum nicht den Thread erneut verwenden, anstatt einen neuen auf jeder Schleife zu erstellen?

+0

wie den Thread wiederverwenden? Eigentlich versuche ich so etwas zu erreichen, warum ich nicht While (true) in main nennen will. – samprat

+0

Der Thread existiert immer noch, also anstatt ihn zu verlassen, schleift man normalerweise nach Beendigung der Arbeit, bis etwas signalisiert, dass mehr Arbeit zu erledigen ist. Die Blockierung kann beispielsweise mit einem Mutex implementiert werden. – Flexo

1

Sie erstellen fortlaufend Threads und stoßen möglicherweise an die Anzahl der Threads. pthread_create Manpage sagt:

EAGAIN Insufficient resources to create another thread, or a system-imposed 
       limit on the number of threads was encountered. The latter case may 
       occur in two ways: the RLIMIT_NPROC soft resource limit (set via 
       setrlimit(2)), which limits the number of process for a real user ID, 
       was reached; or the kernel's system-wide limit on the number of 
       threads, /proc/sys/kernel/threads-max, was reached. 

Sie von der Gestaltung Ihrer Anwendung überdenken sollte. Eine unendliche Anzahl von Threads zu erstellen ist kein Gott-Design.

[UPDATE]

Sie Sperre verwenden eine Integer-Variable zu setzen:

pthread_mutex_lock(&stop_mutex); 
    stopThread = true; 
    pthread_mutex_unlock(&stop_mutex); 

Dies ist jedoch nicht erforderlich ist, als ein int Einstellung Atom ist (auf allen Architekturen wahrscheinlich?). Sie sollten eine Sperre verwenden, wenn Sie nicht-atomare Operationen tun, zum Beispiel: test and set

take_lock(); 
if (a != 1) 
a = 1 
release_lock(); 
+0

exe ​​Danke, dass ich darauf hingewiesen habe, dass dies der Grund für die Beendigung meines Programms sein könnte, aber in der Funktion WorkerThread töte ich eindeutig muxtex. Also ich denke Thread wird getötet. Kann ich falsch liegen, haben Sie alternative Vorschläge? Danke und Grüße, Samprat – samprat

+0

Int ist sehr oft nicht atomar, auch nur für den Satz. – Flexo

+0

@ samprat, das Töten oder Zerstören eines Mutex beendet die Threads nicht. Sie müssen die Threads separat töten. Außerdem sehe ich, dass du den Mutex in der 'threadTest'-Funktion zerstörst und, wie in deinem Kommentar erwähnt, wenn du ihn wieder zerstörst, könntest du einen Absturz bekommen. –

1

Sie erstellen einen neuen Thread jedes Mal ThreadTest genannt wird, und nie diese Fäden zerstören. Letztendlich haben Sie (oder das Betriebssystem) keine Thread-Handles mehr (eine begrenzte Ressource).

1

Threads verbrauchen Ressourcen (Speicher & Verarbeitung), und Sie erstellen einen Thread jedes Mal, wenn Ihre Hauptschleife ruft ThreadTest(). Und Ressourcen sind endlich, während Ihre Schleife nicht ist, so wird dies schließlich einen Speicherzuweisungsfehler werfen.

Sie sollten die Hauptschleife loswerden und ThreadTest den neu erstellten Thread (pthread_t) zurückgeben. Schließlich, make main warten auf die Thread-Beendigung mit pthread_join.

1

Ihre Pthreads sind zombies und verbrauchen Systemressourcen. Unter Linux können Sie ulimit -s verwenden, um Ihre aktiven Obergrenzen zu überprüfen - aber sie sind auch nicht unendlich. Verwenden Sie pthread_join(), um einen Thread fertig zu stellen und die Ressourcen freizugeben, die er verbraucht hat.

Wissen Sie, dass select() in der Lage ist, von mehreren (Geräte-) Handles zu lesen? Sie können auch eine benutzerdefinierte Quelle definieren, um select() oder eine Zeitüberschreitung zu stoppen. In diesem Sinne können Sie einen Thread starten und lassen Sie es schlafen, wenn nichts passiert. Wenn Sie beabsichtigen, es zu stoppen, können Sie ein Ereignis (oder Timeout) senden, um den Funktionsaufruf select() zu unterbrechen.

Ein zusätzliches Entwurfskonzept, das Sie in Betracht ziehen müssen, ist message queues, um Informationen zwischen Ihrer Hauptanwendung und/oder Pthread zu teilen. select() ist mit dieser Technik kompatibel, sodass Sie ein Konzept für Datenquellen (Geräte und Nachrichtenwarteschlangen) verwenden können.

Hier ist ein Hinweis auf eine gute pthread Lesen und die besten Pthread Buch zur Verfügung: Programming with POSIX(R) Threads, ISBN-13: 978-0201633924

Verwandte Themen