2009-07-24 4 views
2

Mit der Semop() - Funktion auf Unix ist es möglich, eine sembuf-Struktur mit sem_op = 0 bereitzustellen. Im Wesentlichen bedeutet dies, dass der aufrufende Prozess wartet/blockiert, bis der Wert des Semaphors Null wird. Gibt es einen gleichwertigen Weg, dies in Windows zu erreichen?Wie warten/blockieren, bis ein Semaphor-Wert 0 in Windows erreicht

Der spezifische Anwendungsfall, den ich implementieren möchte, ist zu warten, bis die Anzahl der Leser Null erreicht, bevor ein Writer schreiben kann. (Ja, das ist eine etwas unorthodoxe Art, Semaphore zu verwenden; weil es keine Begrenzung für die Anzahl von Lesern gibt, gibt es keine Menge von beschränkten Ressourcen, die üblicherweise zur Verwaltung von Semaphoren verwendet wird)

Dokumentation zu unix semop Systemanruf kann hier gefunden werden: http://codeidol.com/unix/advanced-programming-in-unix/Interprocess-Communication/-15.8.-Semaphores/

Antwort

1

Ich habe nie eine ähnliche Funktion wie in der Win32-API gesehen.

Ich denke, der Weg, dies zu tun ist WaitForSingleObject oder ähnliches zu rufen und eine WAIT_OBJECT_0 die gleiche Anzahl wie die maximale Anzahl, die beim Erstellen des Semaphors angegeben wurde. Sie werden dann alle verfügbaren "Slots" halten und jeder andere, der auf dem Semaphor wartet, wird blockieren.

+0

Wenn Sie zahlreiche Schreib Thread haben, dann wird dieses Schema Deadlock, wenn eine Schreib Thread in der Lage, einen einzigen „Schlitz“, da kein Schreib Thread nimmt alle „Slots“ zu greifen. – xryl669

2

Ein Windows semaphore zählt herunter von dem Maximalwert (die maximale Anzahl der zulässigen Leser) auf Null. WaitXxx Funktionen warten auf einen Nicht-Null-Semaphorwert und Dekrement es, ReleaseSemaphoreInkremente der Semaphor (andere Threads warten auf dem Semaphor zu entsperren). Es ist nicht möglich, auf einem Windows-Semaphor anders zu warten, daher ist ein Windows-Semaphor in Ihrem Fall wahrscheinlich die falsche Wahl des Synchronisationsgrundelements. Unter Vista/2008 könnten Sie slim read-write locks verwenden; Wenn Sie frühere Windows-Versionen unterstützen müssen, müssen Sie Ihre eigenen rollen.

1

Die spezifische Anwendungsfall I zu implementieren bin versucht zu warten, bis die Zahl der Leser erreicht Null, bevor ein Schriftsteller schreiben lassen.

Können Sie garantieren, dass die Leserzählung auf Null bleibt, bis der Brenner fertig ist?

Wenn ja, können Sie das Äquivalent von SysV "Warten auf Null" Verhalten mit einer manual-reset event object implementieren, die die Fertigstellung des letzten Lesers anzeigt. Pflegen Sie Ihre eigene (synchronisierte) Anzahl von "aktiven Lesern", dekrementieren Sie, wenn die Leser fertig sind, und signalisieren Sie dem geduldig wartenden Schreiber über SetEvent(), wenn dieser Zählwert Null ist.

Wenn Sie nicht garantieren können, dass die Leser gut erzogen werden, na ja, dann haben Sie eine unglückliche Rennen bekommen mit sogar mit SysV sems zu beschäftigen.

3

Angenommen, Sie haben einen Autorenthread, lassen Sie einfach den Autorenthread den Semaphor verschlingen. Das heißt, greifen Sie den Semaphor über WaitForSingleObject für wie oft Sie die Semaphor-Anzahl zu initialisieren.

Verwandte Themen