2010-11-23 11 views
23

La función pthread_mutex_init le permite especificar un puntero a un atributo. Pero aún no he encontrado una buena explicación de los atributos pthread. Siempre acabo de suministrar NULL. ¿Hay algún uso para este argumento?¿cuál es el "atributo" de un pthread mutex?

La documentación, para aquellos de ustedes que lo olvide:

pthread_mutex_init (3) Biblioteca BSD Funciones Manual
pthread_mutex_init (3)

NOMBRE pthread_mutex_init - crear un mutex

SINOPSIS

#include <pthread.h> 

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

DESCRIPCIÓN La función pthread_mutex_init() crea un nuevo mutex, con los atributos especificados con attr. Si attr es NULL, se usan los atributos predeterminados.

Respuesta

33

El mejor lugar para encontrar esa información es desde las páginas de estándares POSIX.

A NULL El atributo mutex le otorga un atributo predeterminado definido en la implementación. Si desea saber qué puede hacer con los atributos, consulte following reference y siga los enlaces pthread_mutexattr_* en la sección SEE ALSO. Por lo general, el valor predeterminado es un conjunto razonable de atributos, pero puede variar entre plataformas, por lo que prefiero crear explícitamente mutexes con atributos conocidos (mejor para la portabilidad).

Esto es para el número 7 de la norma, 1003.1-2008. El punto de partida para eso es here. Al hacer clic en Headers en la esquina inferior izquierda, podrá navegar a la funcionalidad específica (incluido pthreads.h).

Los atributos le permiten establecer u obtener:

  • la type (deadlocking, estancamiento de detección, recursiva, etc).
  • robustness (qué sucede cuando adquiere un mutex y el propietario original muere mientras lo posee).
  • process-shared attribute (para compartir un mutex a través de los límites del proceso).
  • protocol (cómo se comporta un subproceso en términos de prioridad cuando un subproceso de mayor prioridad quiere el mutex).
  • priority ceiling (la prioridad a la que se ejecutará la sección crítica, una forma de evitar la inversión de prioridad).

Y, para completar, también está el init and destroy calls, no relacionado directamente con un atributo específico, pero usado para crearlos.

1

Si se desplaza por la lista de funciones para <pthread.h>, se encuentra un montón de pthread_mutexattr_... funciones, incluyendo un init, destroy y funciones para establecer diversos atributos de un mutex. Cuando pase NULL, el mutex se crea con los valores predeterminados adecuados para todos estos atributos, pero si necesita modificar atributos específicos, puede construir una estructura pthread_mutexattr_t y pasarla.

4

Todos los atributos mutex se establecen en un atributo mutex objeto por una función de la forma:

int pthread_mutexattr_setname(pthread_attr_t *attr, Type t); 

Todos los atributos de exclusión mutua se recuperan de un objeto mutex atributo por una función de la forma:

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

donde nombre y tipo se definen como en la pestaña a continuación:

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

Aplicar NULL a este argumento implica utilizar el argumento predeterminado. Entonces, por alguna razón, podría querer cambiar estas configuraciones predeterminadas (usando pthread_mutexattr_init).

La documentación explica todo lo que necesita sobre estos ajustes de exclusión mutua.

+3

Si la documentación fuera del todo útil, la pregunta no tendría que ser formulada. :-) Hace casi una hora que intento encontrar las respuestas a la misma pregunta antes de tropezar con esta. –

Cuestiones relacionadas