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?
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.
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%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.
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.
Tags und Links pthreads