PTHREAD_MUTEX_INITIALIZER kontra pthread_mutex_init (& mutex, param)


91

Czy jest jakaś różnica między

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

Lub

pthread_mutex_t lock;
pthread_mutex_init ( &lock, NULL);

Czy jestem wystarczająco bezpieczny, jeśli używam tylko pierwszej metody?

UWAGA: Moje pytanie dotyczy głównie bardzo małych programów, w których co najwyżej to, co zrobię, to podłączenie kilku klientów do serwera i rozwiązywanie ich zapytań za pomocą wątków roboczych.

Odpowiedzi:


74

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 autozmienną zdefiniowaną w treści funkcji. Chociaż nigdy nie widziałem platformy, na której byłoby to niedozwolone, nawet w przypadku autozmiennych, a to ograniczenie zostało usunięte w najnowszej wersji standardu POSIX.

Ten staticwariant 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.


8

Możesz ustawić więcej atrybutów muteksu za pomocą dynamicznej inicjalizacji, a także możesz użyć metody dynamicznej tylko wtedy, gdy dodajesz kilka muteksów w czasie wykonywania.

Nie ma jednak nic złego w podejściu statycznym, jeśli odpowiada to Twoim potrzebom.


ponadto możesz używać metody dynamicznej tylko wtedy, gdy dodajesz kilka muteksów w czasie wykonywania. ” Więc co to oznacza? Mały przykład, jeśli nie jest to łatwe do wyjaśnienia?
Kalec

1
@Kalec: jeśli Twój mutex jest przydzielony przez malloc()(lub należy do przydzielonego obiektu).
Michael Burr,

3
@Kalec jeśli zmienna mutex „lock” jest częścią struktury, nie możemy zastosować pierwszego podejścia. musimy użyć pthread_init ().
pankaj kushwaha

8

Chciałbym zacytować to z tej książki :

W przypadku POSIXwątków istnieją dwa sposoby inicjowania blokad. Można to zrobić PTHREAD_MUTEX_INITIALIZERw następujący sposób: pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

W ten sposób ustawia blokadę na wartości domyślne iw ten sposób czyni blokadę użyteczną. Dynamiczny sposób, aby to zrobić (tj. W czasie wykonywania), polega na wywołaniu pthread_mutex_init()w następujący sposób: int rc = pthread_mutex_init(&lock, NULL); assert(rc == 0); // always check success!

Pierwszym argumentem tej procedury jest adres samej blokady, podczas gdy drugi to opcjonalny zestaw atrybutów. Przeczytaj więcej o atrybutach; przekazanie NULL w po prostu używa wartości domyślnych. Tak czy inaczej działa , ale zwykle używamy metody dynamicznej (drugiej).


5

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.