Starsze wersje standardu POSIX gwarantują, że pierwsza metoda z inicjatorem będzie działać tylko ze zmiennymi przydzielonymi statycznie, a nie wtedy, gdy zmienna jest auto
zmienną zdefiniowaną w treści funkcji. Chociaż nigdy nie widziałem platformy, na której byłoby to niedozwolone, nawet w przypadku auto
zmiennych, a to ograniczenie zostało usunięte w najnowszej wersji standardu POSIX.
Ten static
wariant jest naprawdę preferowany, jeśli możesz, ponieważ pozwala na znacznie łatwiejsze pisanie kodu bootstrap. Za każdym razem, gdy w czasie wykonywania wprowadzasz kod, który używa takiego muteksu, możesz mieć pewność, że mutex został zainicjowany. To cenna informacja w kontekście wielowątkowości.
Metoda wykorzystująca funkcję init jest preferowana, gdy potrzebujesz specjalnych właściwości dla swojego muteksu, takich jak rekurencyjność, np. Możliwość współdzielenia między procesami, a nie tylko między wątkami.
malloc()
(lub należy do przydzielonego obiektu).Chciałbym zacytować to z tej książki :
źródło
W przypadkach, gdy domyślne atrybuty mutexów są odpowiednie, makro PTHREAD_MUTEX_INITIALIZER może zostać użyte do zainicjowania muteksów.
Jeśli chcesz określić atrybuty dla muteksu, idź z dynamiczną inicjalizacją ........
Efekt będzie równoważny dynamicznej inicjalizacji przez wywołanie pthread_mutex_init () z parametrem określonym jako NULL, z wyjątkiem tego, że nie są wykonywane żadne testy błędów.
źródło