¿cuál es el "atributo" de un mutex pthread?


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 lo que son los atributos de pthread. Siempre he suministrado NULL. ¿Tiene sentido este argumento?

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

PTHREAD_MUTEX_INIT (3) Biblioteca BSD Manual de Funciones
PTHREAD_MUTEX_INIT (3)

NOMBRE pthread_mutex_init create 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 un nuevo mutex, con atributos indicado con attr. Si attr es NULL, se utilizan los atributos predeterminados.

Author: casablanca, 2010-11-23

4 answers

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

Un atributo mutex NULL le da un atributo predeterminado definido por la implementación. Si quieres saber qué puedes hacer con los atributos, echa un vistazo a siguiente referencia y sigue los enlaces pthread_mutexattr_* en la sección SEE ALSO. Por lo general, el valor predeterminado es un conjunto sensible de atributos, pero puede variar entre las plataformas, por lo que prefiero crear explícitamente mutexes con atributos conocidos (mejor para portabilidad).

Esto es para el número 7 de la norma, 1003.1-2008. El punto de partida para eso es aquí. Haciendo 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 (deadlocking, deadlock-detecting, recursivo, etc).
  • la robustez (lo que sucede cuando se adquiere un mutex y el propietario original murió mientras poseía se).
  • el atributo process-shared (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 techo de prioridad (la prioridad en la que se ejecutará la sección crítica, una forma de evitar la inversión de prioridad).

Y, para completar, hay las llamadas init y destroy también, no relacionadas directamente con un atributo específico pero usado para crearlos.

 34
Author: paxdiablo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-06 22:51:02

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

int pthread_mutexattr_setname(pthread_attr_t *attr, Type t);

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

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

Donde el nombre y el tipo se definen como en la tabla siguiente:

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
 4
Author: Lorenzo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-23 02:00:21

Si se desplaza hacia abajo en la lista de funciones para <pthread.h>, usted encontrará un montón de pthread_mutexattr_... funciones, incluyendo una init, destroy y funciones para establecer varios atributos de un mutex. Cuando pasa 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.

 1
Author: casablanca,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-23 01:59:40

Aplicar NULL a este argumento implica usar el argumento por defecto. Así que por algunas razones usted podría querer cambiar estas configuraciones predeterminadas (usando pthread_mutexattr_init).

La documentación explica todo lo que necesita sobre estos ajustes mutex.

 0
Author: Julio Guerra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-23 02:01:51