2009-08-18 11 views
10

In einer Graduate-Klasse mussten wir Semaphoren verwenden, um mit Threads zu arbeiten.sem_init (...): Für was ist der Pshared-Parameter?

Wir wurden angewiesen, sem_init zusammen mit einer Reihe anderer sem_ * -Prozedur zu verwenden, aber uns wurden nicht viele Informationen über die Details jeder dieser sem_ * -Methoden gegeben.

Der Prototyp (und Header-Datei) von sem_init ist the following:

#include <semaphore.h> 

int sem_init(sem_t *sem, int pshared, unsigned int value); 

aber ich verstehe nicht, was die pshared Wert für verwendet wird. Nach opengroup.org:

Wenn das Argument pshared einen von Null Wert hat, dann wird der Semaphor zwischen Prozessen geteilt werden; in diesem Fall jeder Prozess, der sem zur Durchführung sem_wait(), sem_trywait(), sem_post(), und sem_destroy() Operationen zugreifen kann das Semaphor sem verwenden.

aber ich denke, ich verstehe nicht den Unterschied zwischen etwa 1,2, 10, 25, 50000, usw. Ich denke, es ist zu sagen, dass, wenn der Wert 0 ist dann die Semaphore nicht geteilt werden. (Aber dann, was ist der Punkt?)

Wie verwende ich diesen pshared Parameter richtig?

Antwort

12

glibc Version von sem_init (was Sie bekommen, wenn Sie man sem_init auf Linux), das zu sagen hat:

„Das pshared Argument gibt an, ob diese Semaphore zu sein ist zwischen den Threads eines Prozesses geteilt, oder zwischen Prozessen. "

So pshared ist ein boolescher Wert: in der Praxis sinnvolle Werte übergeben, um es false (0) und true (1) sind, obwohl jeder Nicht-0-Wert wird als wahr behandelt werden. Wenn Sie den Wert 0 übergeben, erhalten Sie ein Semaphor, auf das andere Threads im selben Prozess zugreifen können - im Wesentlichen eine In-Process-Sperre. Sie können dies als Mutex verwenden, oder Sie können es allgemeiner für die Ressourcen zählenden Eigenschaften eines Semaphors verwenden. Wenn pthreads eine Semaphore-API unterstützt, brauchen Sie diese Funktion von sem_init nicht, aber Semaphore in Unix gehen pthreads um einiges voraus.

Es wäre besser, wenn der Boolean eine Art Enumeration wäre (z. B. SEM_PROCESS_PRIVATE vs SEM_PROCESS_SHARED), denn dann hätten Sie diese Frage nicht gehabt, aber POSIX Semaphoren sind eine ziemlich alte API wie diese Dinge gehen.

+0

Super Antwort, danke für die Erklärung. –

+0

Sie sind herzlich willkommen. Danke für das Kompliment :). – quark

+0

Es ist kein PC diese Version als GLIBC zu bezeichnen. Es ist POSIX.1-2001. –

1

Ich würde sagen, dass es keinen signifikanten Unterschied zwischen den Werten s 1, 2, 5 usw. in Bezug auf den Parameter shared gibt. Wahrscheinlich ist es so geschrieben, weil C beim Erstellen der API keine booleschen Typen hatte.

+0

Macht dies also eine veraltete API? – Sneakyness

+0

Ich weiß nicht - es ist manchmal Wert, eine ältere "erprobte" API zu verwenden. Sie müssen es aus der Sicht von Dingen wie Effizienz und offensichtliche Sicherheitsmängel betrachten, um zu sagen, ob es wirklich veraltet war oder nicht –

+0

Sneakyness: Ja und nein. Nein, in diesem PDthreads, der moderneren Wahl, scheint es keine Semaphor-Implementierung zu geben, also für die Fälle, wo Semaphore die API sind, die Sie verwenden müssen. Ja, in den meisten Fällen werden Mutexe und Bedingungen anstelle von Semaphoren gut funktionieren. – quark

1

Das Pshared-Argument gibt an, ob dieser Semaphor zwischen den Threads eines Prozesses oder zwischen Prozessen aufgeteilt werden soll.

Wenn Pshared den Wert 0 hat, wird das Semaphor zwischen den Threads eines Prozesses geteilt und sollte sich an einer Adresse befinden, die für alle Threads sichtbar ist (z. B. eine globale Variable oder eine dynamisch zugewiesene Variable) Haufen).

Wenn Pshared ungleich Null ist, dann wird das Semaphor zwischen Prozessen aufgeteilt und sollte in einer Region mit gemeinsam genutztem Speicher liegen (siehe shm_open (3), mmap (2) und shmget (2)). (Da ein von fork (2) erstelltes Kind die Speicherzuordnungen seines Elternteils erbt, kann es auch auf den Semaphor zugreifen.) Jeder Prozess, der auf den gemeinsamen Speicherbereich zugreifen kann, kann mit sem_post (3), sem_wait (3) usw. am Semaphor arbeiten

Verwandte Themen