2010-11-23 17 views
23

Funkcja pthread_mutex_init pozwala określić wskaźnik do atrybutu. Ale muszę jeszcze znaleźć dobre wyjaśnienie atrybutów pthread. Zawsze dostarczałem NULL. Czy jest jakiś pożytek z tego argumentu?co to jest "atrybut" muteksu pthread?

Dokumentacja dla tych z Was, którzy go zapomnieć:

pthread_mutex_init (3) BSD Biblioteka Funkcje Ręczne
pthread_mutex_init (3)

NAME pthread_mutex_init - tworzy mutex

SKŁADNIA

#include <pthread.h> 

int 
pthread_mutex_init(pthread_mutex_t *restrict mutex, 
    const pthread_mutexattr_t *restrict attr); 

OPIS Funkcja pthread_mutex_init() tworzy nowy muteks, z atrybutami określonymi z attr. Jeśli attr ma wartość NULL, używane są atrybuty domyślne.

Odpowiedz

33

Najlepszym miejscem do znalezienia tej informacji są strony ze standardami POSIX.

Atrybut mutex daje ci zdefiniowany domyślny atrybut implementacji. Jeśli chcesz wiedzieć, co możesz zrobić z atrybutami, sprawdź numer following reference i postępuj zgodnie z linkami pthread_mutexattr_* w sekcji SEE ALSO. Zwykle wartością domyślną jest rozsądny zestaw atrybutów, ale może się on różnić w zależności od platformy, dlatego wolę jawnie tworzyć muteksy o znanych atrybutach (lepiej dla przenośności).

Jest to dla numeru 7 normy, 1003.1-2008. Punktem wyjścia jest here. Kliknięcie na Headers w lewym dolnym rogu pozwoli na nawigację do określonej funkcji (w tym pthreads.h).

Atrybuty pozwalają ustawić lub dostać:

  • type (deadlocking, impas-wykrywanie, rekurencyjne, etc).
  • the robustness (co się dzieje, gdy nabywasz mutex i pierwotny właściciel zmarł podczas posiadania go).
  • the process-shared attribute (w celu udostępnienia mutexu przez granice procesu).
  • the protocol (jak wątek zachowuje się w kategoriach priorytetu, gdy wątek o wyższym priorytecie chce muteksa).
  • the priority ceiling (priorytet, w którym zostanie uruchomiona sekcja krytyczna, sposób zapobiegania inwersji priorytetów).

Ponadto, dla kompletności, istnieje również init and destroy calls, niezwiązany bezpośrednio z określonym atrybutem, ale używany do ich utworzenia.

1

Jeśli przewinąć funkcję aukcji dla <pthread.h> znajdziesz kilka pthread_mutexattr_... funkcji, w tym init, destroy i funkcji, aby ustawić różne atrybuty mutex. Po przejściu NULL, muteks jest tworzony z odpowiednimi wartościami domyślnymi dla wszystkich tych atrybutów, ale jeśli chcesz zmodyfikować określone atrybuty, możesz skonstruować strukturę pthread_mutexattr_t i przekazać ją.

4

Wszystkie atrybuty mutex są ustawiane w atrybucie mutex obiekt o funkcji postaci:

int pthread_mutexattr_setname(pthread_attr_t *attr, Type t); 

Wszystkie atrybuty mutex są pobierane z obiektu mutex atrybutu przez funkcję postaci:

int pthread_mutexattr_getname(const pthread_attr_t *attr, Type *t); 

gdzie nazwa i typ są zdefiniowane w zakładce le poniżej:

Type and Name Description and Value(s) 
int protocol Define the scheduling classes for mutex locks 
       PTHREAD_PRIO_NONE,PTHREAD_PRIO_PROTECT, 
       PTHREAD_PRIO_INHERIT 

int pshared Defines whether a mutex is shared with other processes. 
       PTHREAD_PROCESS_SHARED, PTHREAD_PROCESS_PRIVATE 

int prioceiling Used for mutex attribute priority ceiling values. 
       See POSIX.1 section 13 

int type Application defined mutex locking 
       PTHREAD_MUTEX_NORMAL,PTHREAD_MUTEX_RECURSIVE, 
       PTHREAD_MUTEX_ERRORCHECK,PTHREAD_MUTEX_DEFAULT 
0

Zastosowanie NULL do tego argumentu implikuje użycie domyślnego argumentu. Z pewnych powodów możesz chcieć zmienić te domyślne ustawienia (używając pthread_mutexattr_init).

Dokumentacja zawiera wszystkie informacje na temat tych ustawień muteksu.

+3

Jeśli dokumentacja była w ogóle użyteczna, pytanie nie musiałoby być zadawane. :-) Próbowałem przez większą część godziny znaleźć odpowiedzi na to samo pytanie, zanim natknąłem się na ten. –