attributes - ¿Cuál es el "atributo" de un mutex pthread?
pthreads (4)
Aplicar NULL a este argumento implica usar el argumento predeterminado. Por alguna razón, es posible que desee cambiar esta configuración predeterminada (usando pthread_mutexattr_init).
La documentación explica todo lo que necesita sobre estas configuraciones de exclusión mutua.
La función pthread_mutex_init le permite especificar un puntero a un atributo. Pero todavía tengo que encontrar una buena explicación de qué son los atributos de pthread. Siempre me acaba de proporcionar NULL. ¿Hay algún uso para este argumento?
La documentación, para los que lo olviden:
PTHREAD_MUTEX_INIT (3) Manual de funciones de biblioteca BSD
PTHREAD_MUTEX_INIT (3)NOMBRE pthread_mutex_init - crea 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 una nueva exclusión mutua, con atributos especificados con attr. Si attr es NULL, se utilizan los atributos predeterminados.
El mejor lugar para encontrar esa información es de las páginas de estándares de POSIX.
Un atributo de NULL
mutua NULL
le proporciona un atributo predeterminado definido por la implementación. Si desea saber qué puede hacer con los atributos, consulte la siguiente referencia 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 mutex explícitamente 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 está here . Al hacer clic en Headers
en la parte inferior izquierda le permitirá navegar a la funcionalidad específica (incluyendo pthreads.h
).
Los atributos le permiten establecer u obtener:
- el tipo (interbloqueo, detección de interbloqueo, recursivo, etc.).
- la robustez (lo que sucede cuando adquiere un mutex y el propietario original murió mientras lo poseía).
- el atributo de proceso compartido (para compartir un mutex a través de los límites del proceso).
- el protocolo (cómo se comporta un hilo en términos de prioridad cuando un hilo de mayor prioridad quiere el mutex).
- el límite de prioridad (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án las llamadas init y destroy , que no están directamente relacionadas con un atributo específico sino que se utilizan para crearlas.
Si se desplaza hacia abajo en la lista de funciones para <pthread.h>
, encontrará un grupo de funciones pthread_mutexattr_...
, que incluyen init
, destroy
y funciones para configurar varios atributos de un mutex. Cuando pasa NULL
, el mutex se crea con valores predeterminados adecuados para todos estos atributos, pero si necesita modificar atributos específicos, puede construir una estructura pthread_mutexattr_t
y pasarla.
Todos los atributos de exclusión mutua se establecen en un objeto de atributo de exclusión mutua mediante 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 de atributo de exclusión mutua mediante 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 tabla 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