Bei älteren Versionen des POSIX-Standards funktioniert die erste Methode mit einem Initialisierer garantiert nur mit statisch zugewiesenen Variablen, nicht wenn die Variable eine auto
Variable ist, die in einem Funktionskörper definiert ist. Obwohl ich noch nie eine Plattform gesehen habe, auf der dies selbst für auto
Variablen nicht zulässig wäre, wurde diese Einschränkung in der neuesten Version des POSIX-Standards aufgehoben.
Die static
Variante 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.
malloc()
(oder zu einem Objekt gehört, das zugewiesen ist).Ich möchte dies aus diesem Buch zitieren :
quelle
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.
quelle