PTHREAD_MUTEX_INITIALIZER vs. pthread_mutex_init ( &mutex, param)

Lesezeit: 3 Minuten

Kalecs Benutzeravatar
Kalec

Gibt es einen Unterschied zw

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 Worker-Threads lösen werde.

Benutzeravatar von Jens Gustedt
Jens Gustedt

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

Das static Variante ist wirklich vorzuziehen, wenn Sie mögen, da es das Schreiben von Bootstrap-Code viel einfacher macht. Wann immer Sie zur Laufzeit Code eingeben, der einen solchen Mutex verwendet, können Sie sicher sein, dass der Mutex initialisiert wird. Dies ist eine wertvolle Information im Multi-Threading-Kontext.

Die Methode, die eine Init-Funktion verwendet, ist vorzuziehen, wenn Sie spezielle Eigenschaften für Ihren Mutex benötigen, z. B. rekursiv sein oder von Prozessen gemeinsam genutzt werden können, nicht nur von Threads.

Benutzeravatar von Mari202
Mari202

Daraus möchte ich zitieren Buchen:

Mit POSIX Threads gibt es zwei Möglichkeiten, Sperren zu initialisieren. Eine Möglichkeit, dies zu tun, ist die Verwendung PTHREAD_MUTEX_INITIALIZERfolgendermaßen:
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

Dadurch wird die Sperre auf die Standardwerte gesetzt und somit nutzbar gemacht. Der dynamische Weg, dies zu tun (dh zur Laufzeit), besteht darin, einen Aufruf an zu tätigen pthread_mutex_init() folgendermaßen:
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; die Übergabe von NULL verwendet einfach die Standardwerte. So oder so funktioniertaber wir verwenden normalerweise die dynamische (letztere) Methode.

Mit der dynamischen Initialisierung können Sie 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.

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

  • Außerdem können Sie die dynamische Methode nur verwenden, wenn Sie zur Laufzeit eine Reihe von Mutexes hinzufügen. „Also, was bedeutet das? Ein kleines Beispiel, wenn es nicht einfach zu erklären ist?

    – Kalec

    14. Januar 2013 um 14:24 Uhr


  • @Kalec: Wenn Ihr Mutex von zugewiesen wird malloc() (oder gehört zu einem zugeordneten Objekt).

    – Michael Burr

    17. Januar 2013 um 22:00 Uhr

  • @Kalec Wenn die Mutex-Variable “lock” Teil einer Struktur ist, können wir dem ersten Ansatz nicht folgen. wir müssen pthread_init() verwenden.

    – pankaj kushwaha

    12. September 2015 um 18:25 Uhr

In Fällen, in denen standardmäßige Mutex-Attribute geeignet sind, kann das Makro PTHREAD_MUTEX_INITIALIZER verwendet werden, um Mutexe zu initialisieren.

Wenn Sie Attribute für Mutex angeben möchten, gehen Sie mit dynamischer Initialisierung ……..

Der Effekt soll äquivalent zu einer dynamischen Initialisierung durch einen Aufruf von pthread_mutex_init() sein, wobei der Parameter attr als NULL angegeben ist, außer dass keine Fehlerprüfungen durchgeführt werden.

1421290cookie-checkPTHREAD_MUTEX_INITIALIZER vs. pthread_mutex_init ( &mutex, param)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy