pthreads, woher weiß ich, dass ein anderer Thread innerhalb des Prozesses nicht wartet?

8

OS ist Linux, arbeitet mit Pthreads

Ich habe zwei Worker-Threads, die für immer ausgeführt werden, bis eine Stoppvariable den Wert "true" annimmt und die Threads ordnungsgemäß beendet werden. Statt auf Besetzt zu warten, rufen beide Threads pthread_cond_wait auf, bis ein Signal eine neue Aufgabe meldet. Das System funktioniert gut.

Es ist erforderlich, einen "info" -Thread zu erstellen, der einige Debugging-Informationen ausgibt. Der Info-Thread versucht, alle 30 Sekunden Informationen zu lesen und auszudrucken. Als Teil dieser Informationen möchte ich der STAAT jedes Worker-Threads sein. Ist es möglich, einen Thread in "pthread_cond_wait" zu blockieren? Wenn der Thread wartet, ist pthread_cond_wait und dann STATE == wartet sonst der STATE == running.

%Vor%

Natürlich können wir tun, dass wir mehr Code schreiben. Wir können dem obigen Snippet eine globale Variable hinzufügen markiert diesen Thread als gesperrt. Der Code kann gemacht werden

%Vor%

Die Frage ist, ob es einen leichter skalierbaren Weg gibt. Der Stapel eines wartenden Threads ist

%Vor%     
cateof 30.11.2011, 15:13
quelle

4 Antworten

0

Sie könnten die Rückgabe von pthread_self() als Kennung für den Mutex-Besitz verwenden. Speichern und vergleichen. Da ein Mutex von einem einzelnen Thread gleichzeitig erfasst werden kann, wissen Sie, welcher Thread gerade ausgeführt wird (nicht wartet) und welcher nicht.

    
jweyrich 30.11.2011, 15:22
quelle
1

Sie können eine gemeinsame Struktur s im Mutex mit pthread_mutexattr_getpshared , wobei jeder Thread seinen Zustand registriert (läuft, nicht läuft) mit Hilfe von pthread_self() .

Bevor Sie die Konditionsvariable prüfen, können Sie s[pthread_self()]->state = WAITING setzen, und nach der Überprüfung können Sie s[pthread_self()]->state = WORKING einstellen.

Achten Sie darauf, die Struktur so zu gestalten, dass keine Wettlaufsituation auftritt.

    
akappa 30.11.2011 15:27
quelle
1

Ich würde den einfachen Weg gehen und nur eine Statusaufzählung pro Thread hinzufügen. Vor jeder begrifflichen Zustandsänderung würden Sie den Zustand ändern.

%Vor%

Dann in deinem Interview-Thread:

%Vor%

Wenn Sie aus um 30 Sekunden heruntergeschaltet haben, weil der Status nach dem Drucken aktualisiert wurde rechts , spielt das keine Rolle. Sie müssen den Status nicht sperren, da Sie nur vom übergeordneten Worker schreiben und nur vom Debug-Thread lesen.

    
user7116 30.11.2011 15:30
quelle
0

Vermutlich verwenden Sie einen Mutex, der gesperrt ist, wenn die Bedingung gemeldet wird. Wenn ja, versuchen Sie in Ihrem Informationsthread, diesen Mutex zu sperren - wenn Sie ihn erhalten, ist es möglich, dass der Thread zu der Zeit, als Sie die Stichprobe erstellt haben warten, sonst würde es blockieren, dann wüsstest du, dass der Thread seine Sache macht (dh er hat diesen Mutex erworben, was bedeutet, dass er in seinem kritischen Abschnitt ist)

    
Nim 30.11.2011 15:17
quelle

Tags und Links