PTHREAD_MUTEX_INITIALIZER vs pthread_mutex_init (& mutex, param)

88

Gibt es einen Unterschied zwischen

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

Oder

pthread_mutex_t lock;
pthread_mutex_init ( &lock, NULL);

Bin ich sicher genug, wenn ich nur die erste Methode verwende?

HINWEIS: Meine Frage bezieht sich hauptsächlich auf sehr kleine Programme, bei denen ich höchstens mehrere Clients mit einem Server verbinden und ihre Anfragen mit Arbeitsthreads lösen werde.

Kalec
quelle

Antworten:

72

Bei älteren Versionen des POSIX-Standards funktioniert die erste Methode mit einem Initialisierer garantiert nur mit statisch zugewiesenen Variablen, nicht wenn die Variable eine autoVariable ist, die in einem Funktionskörper definiert ist. Obwohl ich noch nie eine Plattform gesehen habe, auf der dies selbst für autoVariablen nicht zulässig wäre, wurde diese Einschränkung in der neuesten Version des POSIX-Standards aufgehoben.

Die staticVariante ist wirklich vorzuziehen, wenn Sie möchten, da sie das Schreiben von Bootstrap-Code erheblich erleichtert. Immer wenn Sie zur Laufzeit einen Code eingeben, der einen solchen Mutex verwendet, können Sie sicher sein, dass der Mutex initialisiert wird. Dies ist eine wertvolle Information im Multithreading-Kontext.

Die Methode mit einer Init-Funktion ist vorzuziehen, wenn Sie spezielle Eigenschaften für Ihren Mutex benötigen, z. B. rekursiv, z. B. oder gemeinsam nutzbar zwischen Prozessen, nicht nur zwischen Threads.

Jens Gustedt
quelle
8

Sie können mit der dynamischen Initialisierung weitere Attribute des Mutex festlegen. Außerdem können Sie die dynamische Methode nur verwenden, wenn Sie zur Laufzeit eine Reihe von Mutexen hinzufügen.

An dem statischen Ansatz ist jedoch nichts auszusetzen, wenn dies Ihren Anforderungen entspricht.

Joe
quelle
" Außerdem können Sie die dynamische Methode nur verwenden, wenn Sie zur Laufzeit eine Reihe von Mutexen hinzufügen. " Was bedeutet das? Ein kleines Beispiel, wenn es nicht einfach zu erklären ist?
Kalec
1
@Kalec: Wenn Ihr Mutex von zugewiesen ist malloc()(oder zu einem Objekt gehört, das zugewiesen ist).
Michael Burr
3
@Kalec Wenn die Mutex-Variable "lock" Teil einer Struktur ist, können wir dem 1. Ansatz nicht folgen. wir müssen pthread_init () verwenden.
Pankaj Kushwaha
7

Ich möchte dies aus diesem Buch zitieren :

Bei POSIXThreads gibt es zwei Möglichkeiten, Sperren zu initialisieren. Eine Möglichkeit, dies zu tun, besteht darin PTHREAD_MUTEX_INITIALIZER, Folgendes zu verwenden: pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

Dadurch wird die Sperre auf die Standardwerte gesetzt und die Sperre somit verwendet. Die dynamische Methode (dh zur Laufzeit) besteht darin, einen Anruf pthread_mutex_init()wie folgt zu tätigen : int rc = pthread_mutex_init(&lock, NULL); assert(rc == 0); // always check success!

Das erste Argument für diese Routine ist die Adresse der Sperre selbst, während das zweite ein optionaler Satz von Attributen ist. Lesen Sie selbst mehr über die Attribute. Wenn Sie NULL übergeben, werden einfach die Standardeinstellungen verwendet. So oder so funktioniert es , aber wir verwenden normalerweise die dynamische (letztere) Methode.

Mari202
quelle
4

In Fällen, in denen Standard-Mutex-Attribute angemessen sind, kann das Makro PTHREAD_MUTEX_INITIALIZER zum Initialisieren von Mutexen verwendet werden.

Wenn Sie Attribute für Mutex angeben möchten, wählen Sie die dynamische Initialisierung.

Der Effekt entspricht der dynamischen Initialisierung durch einen Aufruf von pthread_mutex_init () mit dem Parameter attrspecified als NULL, außer dass keine Fehlerprüfungen durchgeführt werden.

Ramesh Miriyala
quelle