Semaphor
(Computer) Erklärung folgt noch... irgendwann. Bis dahin siehe hier.

Beispiel: Producer/Consumer-Synchronisation mit einem gemeinsamen Puffer, der zehn Einträge fasst. Der Puffer wird zyklisch gefüllt und geleert.

 /* Globale Variablen */
 semaphore used =  0;     /* Anzahl der belegten Plätze */
 semaphore free = 10;     /* Anzahl der freien Plätze */
 item buffer[10];         /* Gemeinsamer Pufferspeicher */
 int head = 0;            /* Index des ersten freien Platzes */
 int tail = 0;            /* Index des ersten belegten Platzes */

 /* Producer */
 void produce() {
   while (TRUE) {
     down(free);
     buffer[head] = produce_item();
     head = (head + 1) % 10;
     up(used);
   }
 }

 /* Consumer */
 void consume() {
   while (TRUE) do {
     down(used);
     consume_item(buffer[tail]);
     tail = (tail + 1) % 10;
     up(free);
   }
 }

Anmerkung: Diese Implementierung kommt ohne zusätzlichen Mutex (bin. Semaphor) für den Zugriff auf head und tail aus, da der Producer nur auf head und der Consumer nur auf tail zugreift. Wenn es allerdings mehrere Consumer oder Producer gibt, dann muss auch das Speichern/Lesen in/aus dem Puffer und das anschließende Weiterzählen von head/tail durch einen Mutex vor Konflikten geschützt werden.


Referenzen auf Semaphor:

Zuletzt geändert am 14 März 2005 16:17 Uhr von chrschn