Unterschied zwischen Abschlussvariablen und Semaphoren

7

Im Linux-Kernel werden Semaphore verwendet, um kritische Abschnitte von Daten gegenseitig auszuschließen, und Abschlussvariablen werden verwendet, um zwischen zwei auf ein Ereignis wartenden Threads zu synchronisieren. Warum nicht Semaphore für eine solche Synchronisation verwenden? Gibt es einen Vorteil, eine Vervollständigungsvariable über ein Semaphor zu verwenden?

    
Bandicoot 21.01.2011, 23:29
quelle

2 Antworten

9

Es gibt zwei Gründe, warum Sie eine Vervollständigung anstelle eines Semaphors verwenden möchten. Erstens können mehrere Threads auf einen Abschluss warten, und sie können alle mit einem Aufruf von complete_all() freigegeben werden. Es ist komplexer, wenn ein Semaphor eine unbekannte Anzahl von Threads aktiviert.

Zweitens, wenn der wartende Thread das Synchronisationsobjekt freigibt, gibt es eine Race-Bedingung, wenn Sie Semaphore verwenden. Das heißt, dass der Kellner aufgeweckt werden und das Objekt freigeben kann, bevor der Waking-Thread mit up() ausgeführt wird. Diese Rasse existiert nicht für die Fertigstellung. (Siehe Lasses Beitrag.)

    
Karmastan 22.01.2011, 01:30
quelle
12

Erklärung, warum Komplettierungen ursprünglich implementiert wurden: Ссылка

  

Die grundlegende Zusammenfassung ist, dass wir das hatten   (ziemlich häufig) Art zu warten   bestimmte Ereignisse durch Sperren   Semaphor auf dem Stapel des Kellners,   und dann den Kellner machen lassen   "down ()", wodurch es blockiert wurde   bis das Ding, auf das es wartete, tat   ein "up ()".

     

Das funktioniert ziemlich gut, aber es hat eine   wirklich kleine (und ziemlich unwahrscheinliche) Rasse   bei SMP ist das nicht so sehr ein Rennen von   die Idee selbst, wie von der   Implementierung der Semaphore. Wir   hätte die Semaphore reparieren können, aber   Es gab ein paar Gründe nicht zu:

     
  • Die Semaphore sind (für den Nichtstreitfall) (absichtlich) optimiert.   Die "Warten auf Fertigstellung" -Benutzung hat   der umgekehrte Standardfall
  •   
  • die Semaphore sind ziemlich involviert und architekturspezifisch genau   aufgrund dieser Optimierung. Versuchen   ändern sie ist schmerzhaft wie die Hölle.
  •   

Also habe ich stattdessen die Idee von   "Warten auf die Fertigstellung":

Neueren Thread über Vervollständigungen vs Semaphoren Ссылка

    
Lasse 22.01.2011 01:30
quelle