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.
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.
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.
14212900cookie-checkPTHREAD_MUTEX_INITIALIZER vs. pthread_mutex_init ( &mutex, param)yes