pthread bedingte Variable

8

Ich implementiere einen Thread mit einer Warteschlange von Aufgaben. Sobald die erste Aufgabe zur Warteschlange hinzugefügt wird, startet der Thread sie.

Sollte ich die pthread-Zustandsvariable verwenden, um den Thread aufzuwecken, oder gibt es einen geeigneteren Mechanismus?

Wenn ich pthread_cond_signal() aufruft, wenn der andere Thread nicht von pthread_cond_wait() blockiert wird, sondern etwas tut, was passiert dann? Wird das Signal verloren gehen?

    
jackhab 08.02.2009, 09:54
quelle

5 Antworten

11

Aus dem pthread_cond_signal-Handbuch :

  

Die Funktionen pthread_cond_broadcast () und pthread_cond_signal () sollen keine Wirkung haben, wenn momentan keine Threads auf Cond.

blockiert sind

Ich schlage vor, dass Sie Semaphoren verwenden. Grundsätzlich wird jedes Mal, wenn eine Aufgabe in die Warteschlange eingefügt wird, der Semaphor "hochgefahren". Der Worker-Thread blockiert den Semaphor, indem er ihn "herunterfährt". Da es für jede Aufgabe einmal "hochgefahren" wird, wird der Worker-Thread so lange fortgesetzt, wie sich Aufgaben in der Warteschlange befinden. Wenn die Warteschlange leer ist, befindet sich der Semaphor auf 0, und der Worker-Thread blockiert, bis eine neue Aufgabe eintrifft. Semaphoren können auch leicht mit dem Fall umgehen, wenn mehr als eine Aufgabe angekommen ist, während der Arbeiter beschäftigt war. Beachten Sie, dass Sie den Zugriff auf die Warteschlange weiterhin sperren müssen, um atomare Einfügungen beizubehalten / zu entfernen.

    
Joao da Silva 08.02.2009, 10:22
quelle
12

Semaphore sind gut, wenn und nur wenn Ihre Warteschlange bereits threadsicher ist. Ebenfalls, Einige Semaphore-Implementierungen können durch den oberen Zählerwert begrenzt sein. Es ist sogar unwahrscheinlich, dass Sie den Maximalwert überschreiten würden.

Dies ist der einfachste und korrekteste Weg:

%Vor%     
artyom 08.02.2009 14:44
quelle
1

Das Signal geht verloren, aber Sie möchten, dass das Signal in diesem Fall verloren geht. Wenn kein Thread zum Aufwecken vorhanden ist, hat das Signal keinen Zweck. (Wenn niemand auf etwas wartet, muss niemand benachrichtigt werden, wenn es passiert, oder?)

Mit Zustandsvariablen können verlorene Signale nicht dazu führen, dass ein Thread "durch ein Feuer schlummert". Es sei denn, Sie programmieren tatsächlich einen Thread, um zu schlafen, wenn es bereits einen Brand gibt, es besteht keine Notwendigkeit, "ein Signal zu speichern". Wenn das Feuer beginnt, weckt Ihre Sendung alle schlafenden Fäden. Und Sie müssten ziemlich dumm sein, einen Thread zu programmieren, um schlafen zu gehen, wenn es bereits ein Feuer gibt.

    
David Schwartz 02.09.2011 11:03
quelle
0

Wie bereits angedeutet, sollten Semaphore die beste Wahl sein. Wenn Sie eine Warteschlange mit fester Größe benötigen, verwenden Sie einfach 2 Semaphore (wie im klassischen Producer-Consumer).

Im artyom-Code wäre es besser, "if" durch "while" in der pop () -Funktion zu ersetzen, um ein ungewolltes Aufwecken zu behandeln.

    
mp81ss 08.01.2013 08:33
quelle
0

Keine Effekte.

Wenn Sie überprüfen, wie pthread_condt_signal implementiert ist, verwendet der condt mehrere Zähler, um zu prüfen, ob wartende Threads zum Aufwachen vorhanden sind. z. B. glibc-nptl

%Vor%     
pepero 11.06.2014 09:50
quelle

Tags und Links