Ich versuche, die Ähnlichkeiten und Unterschiede zwischen benannten und unbenannten Semaphoren zu verstehen, also führte meine Google-Suche zu mir dies . Ich hatte jedoch eine Frage zu dem Wortlaut auf der Seite, es heißt:
So weit ist hier, was ich habe:
%Vor%Das ist alles, was ich aus dieser Definition herauslesen konnte. Ist das alles und sind sie richtig? Oder fehlt mir ein wichtiges Konzept?
Denken Sie an wer auf den Semaphor zugreifen kann.
Unbenannte Semaphore (die keinen Namen oder Handle haben, um sie zu finden) müssen in einem bereits bestehenden, vereinbarten Speicherort vorhanden sein. Normalerweise ist dies (1) geteilter Speicher (von Kindern nach fork
geerbt) im Fall von untergeordneten Prozessen; oder (2) Shared Memory, globale Variable oder der Heap in dem Fall, in dem sie zwischen Threads eines einzelnen Prozesses geteilt werden. Das Wesentliche hierbei ist, dass der Code in Eltern, Kind oder Threads bereits die Adresse des Semaphors kennt.
Benannte Semaphore sind für nicht verwandte Prozesse notwendig. Zum Beispiel könnten ein Produzent und ein Verbraucher von zwei verschiedenen Entwicklern geschrieben werden und als völlig unabhängige Prozesse laufen. Aber sie müssen einige Ressourcen teilen, die durch einen Semaphor geschützt werden müssen. Der benannte Semaphor gibt ihnen einen Weg zum Semaphor.
In Wirklichkeit können Sie einen benannten Semaphor in allen Szenarien verwenden, aber sie kommen mit etwas mehr Gepäck, weil Sie mit den Pfaden und Berechtigungen umgehen müssen und solche, die nicht notwendig sind, wenn die Programme verwandt sind und bereits wissen, wie man auf einen unbenannten zugreift Semaphor. Es ist zum Beispiel ein wenig albern, einen benannten Semaphor zu verwenden, um eine Ressource zwischen Threads freizugeben. Die Threads haben bereits Zugriff auf denselben Speicher, in dem sich ein unbenannter Semaphor befinden könnte.
Die angenommene Antwort ist falsch (genau wie die andere von @electron). Unbenannte POSIX-Semaphore können von nicht verwandten Prozessen verwendet werden. Sie müssen nur die Datenstruktur im Shared Memory speichern, auf die die relevanten Prozesse zugreifen können, und sie mit dem Shareable-Flag auf 1 setzen, wie hier gezeigt (schamlos kopiert von Ссылка ):
%Vor%Ein anderer Prozess, der diesen geteilten Speicher in seinen Adressraum abbildet, kann auf denselben Semaphor zugreifen und mit dem ursprünglichen Prozess synchronisieren. Siehe auch die POSIX-Spezifikation von sem_init () und deren Linux-Manpage .
Benannter Semaphor hat eine actual name
in file system
und kann shared
durch mehrere nicht verwandte Prozesse sein.
Unbenannte Semaphore können nur von threads
verwendet werden, die zum gleichen Prozess gehören.
Semaphore werden mit der Funktion
erstellt %Vor%wo
ptr_semaphore : ein Zeiger auf Semaphor
flag : Eine Flagge, die den Grad der Freigabe angibt
initial_value : der Anfangswert der Semaphore
Wenn Sie flag=0
an sem_init()
übergeben, dann kann Semaphor
wird nur von Threads freigegeben, die zu dem Prozess gehören, der den Semaphor erstellt hat. Dadurch wird unbemannter Semaphor erstellt.
Wenn Sie einen Wert ungleich Null übergeben, wird allow
andere Prozesse auch auf den Semaphor zugreifen . Daher wird Semaphor genannt.