Opciones de biblioteca de hebras

Esta sección describe atributos especiales de hebras, exclusiones mutuas y variables de condición.

El estándar POSIX para la biblioteca de hebras especifica la implementación de algunas partes como opcional. Todas las subrutinas definidas por la API de biblioteca de hebras siempre están disponibles. Dependiendo de las opciones disponibles, es posible que algunas subrutinas no se implementen. Las aplicaciones pueden llamar a subrutinas no implementadas, pero siempre devuelven el código de error ENOSYS .

Atributos de pila

Se asigna una pila para cada hebra. La gestión de pilas depende de la implementación. Por lo tanto, la siguiente información sólo se aplica a AIX®, aunque pueden existir características similares en otros sistemas.

La pila se asigna dinámicamente cuando se crea la hebra. Utilizando atributos de hebra avanzados, es posible que el usuario controle el tamaño de pila y la dirección de la pila. La información siguiente no se aplica a la hebra inicial, que crea el sistema.

tamaño de pila

La opción de tamaño de pila habilita el control del atributo stacksize de un objeto de atributos de hebra. Este atributo especifica el tamaño de pila mínimo que se utilizará para la hebra creada.

El atributo stacksize se define en AIX. El atributo y las subrutinas siguientes están disponibles cuando se implementa la opción:

El valor predeterminado del atributo stacksize es 96 KB. El valor mínimo del atributo stacksize es de 16 KB. Si el valor asignado es menor que el valor mínimo, se asigna el valor mínimo.

En la implementación de AIX de la biblioteca de hebras, se asigna un fragmento de datos, denominado área de hebras de usuario, para cada hebra creada. El área se divide en las siguientes secciones:
  • Una zona roja, que está protegida contra lectura y contra escritura para la detección de desbordamiento de pila. No hay zona roja en los programas que utilizan páginas grandes.
  • Una pila predeterminada.
  • Una estructura pthread.
  • Una estructura de hebra.
  • Una estructura de atributo de hebra.
Nota: El área de hebra de usuario descrita aquí no tiene ninguna relación con la estructura uthread utilizada en el kernel AIX . Sólo se accede al área de hebra de usuario en modalidad de usuario y la gestiona exclusivamente la biblioteca de hebras, mientras que la estructura uthread sólo existe en el entorno de kernel.

Opción POSIX de dirección de pila

La opción de dirección de pila habilita el control del atributo stackaddr de un objeto de atributos de hebra. Este atributo especifica la ubicación del almacenamiento que se utilizará para la pila de la hebra creada.

El atributo y las subrutinas siguientes están disponibles cuando se implementa la opción:
  • El atributo stackaddr del objeto de atributos de hebra especifica la dirección de la pila que se asignará a una hebra.
  • La subrutina pthread_attr_getstackaddr devuelve el valor del atributo.
  • y la subrutina pthread_attr_setstackaddr establece el valor.

Si no se especifica ninguna dirección de pila, el sistema asigna la pila en una dirección arbitraria. Si debe tener la pila en una ubicación conocida, puede utilizar el atributo stackaddr . Por ejemplo, si necesita una pila muy grande, puede establecer su dirección en un segmento no utilizado, lo que garantiza que la asignación será satisfactoria.

Si se especifica una dirección de pila al llamar a la subrutina pthread_create , el sistema intenta asignar la pila en la dirección indicada. Si falla, la subrutina pthread_create devuelve EINVAL. Puesto que la subrutina pthread_attr_setstackaddr no asigna realmente la pila, sólo devuelve un error si la dirección de pila especificada excede el espacio de direccionamiento.

Opción POSIX de planificación de prioridad

La opción de planificación de prioridad permite el control de la planificación de ejecución a nivel de hebra. Cuando esta opción está inhabilitada, todas las hebras de un proceso comparten las propiedades de planificación del proceso. Cuando esta opción está habilitada, cada hebra tiene sus propias propiedades de planificación. Para las hebras de ámbito de contención local, las propiedades de planificación se manejan a nivel de proceso mediante un planificador de biblioteca, mientras que para las hebras de ámbito de contención global, las propiedades de planificación se manejan a nivel de sistema mediante el planificador de kernel.

Los atributos y subrutinas siguientes están disponibles cuando se implementa la opción:

  • El atributo heresched del objeto de atributos de hebra
  • El atributo schedparam del objeto de atributos de hebra y de la hebra
  • El atributo schedpolicy de los objetos de atributos de hebra y la hebra
  • El atributo contention-scope de los objetos de atributos de hebra y la hebra
  • Las subrutinas pthread_attr_getschedparam y pthread_attr_setschedparam
  • La subrutina pthread_getschedparam

Comprobación de la disponibilidad de una opción

Las opciones se pueden comprobar en tiempo de compilación o en tiempo de ejecución. Los programas portátiles deben comprobar la disponibilidad de las opciones antes de utilizarlas, para que no sea necesario reescribirlas cuando se porten a otros sistemas.

Comprobación en tiempo de compilación

Cuando una opción no está disponible, puede detener la compilación, como en el ejemplo siguiente:
#ifndef _POSIX_THREAD_ATTR_STACKSIZE
#error "The stack size POSIX option is required"
#endif
El archivo de cabecera pthread.h también define los símbolos siguientes que pueden utilizar otros archivos de cabecera o programas:
_POSIX_REENTRANT_FUNCTIONS
Indica que las funciones reentrantes son necesarias
_SUBPROCESOS de posición
Indica la implementación de la biblioteca de hebras

Comprobación de tiempo de ejecución

La subrutina sysconf se puede utilizar para obtener la disponibilidad de las opciones en el sistema donde se ejecuta el programa. Esto es útil al portar programas entre sistemas que tienen una compatibilidad binaria, como dos versiones de AIX.

La lista siguiente indica los símbolos que están asociados con cada opción y que se deben utilizar para el parámetro Nombre de la subrutina sysconf . Las constantes simbólicas se definen en el archivo de cabecera unistd.h .

Dirección de pila
_SC_THREAD_ATTR_STACKADDR
tamaño de pila
_SC_THREAD_ATTR_STACKSIZE
Planificación de prioridad
_SC_THREAD_PRIORITY_SCHEDULING
Herencia de prioridad
_SC_THREAD_PRIO_INHERIT
Protección prioritaria
_SC_THREAD_PRIO_PROTECT
Compartición de procesos
_SC_THREAD_PROCESS_SHARED
Para comprobar las opciones generales, utilice la subrutina sysconf con los siguientes valores de parámetro Nombre :
_SC_FUNCIÓN_REENTRANTE
Indica que las funciones reentrantes son necesarias.
_SUBPROCESOS
Indica la implementación de la biblioteca de hebras.

Uso compartido de procesos

AIX y la mayoría de los sistemas UNIX permiten que varios procesos compartan un espacio de datos común, conocido como memoria compartida. Los atributos de proceso compartido para variables de condición y mutexes están pensados para permitir que estos objetos sean asignados en memoria compartida para soportar la sincronización entre hilos pertenecientes a diferentes procesos. Sin embargo, puesto que no hay ninguna interfaz estándar del sector para la gestión de memoria compartida, la opción POSIX de compartición de procesos no se implementa en la biblioteca de hebras de AIX .

Tipos de datos de hebras

Los siguientes tipos de datos están definidos para la biblioteca de hebras. La definición de estos tipos de datos puede variar entre sistemas:
PTHREAD_T
Identifica una hebra
atr_pthread_t
Identifica un objeto de atributos de hebra
cond_pthread_t
Identifica una variable de condición
condato_pthread_t
Identifica un objeto de atributos de condición
clave_pthread_t
Identifica una clave de datos específica de hebra
pthread_mutex_t
Identifica un mútex
pthread_mutexattr_t
Identifica un objeto de atributos mutex
pthread_once_t
Identifica un objeto de inicialización de una sola vez

Límites y valores predeterminados

La biblioteca de hebras tiene algunos límites dependientes de la implementación y valores predeterminados. Estos límites y valores predeterminados se pueden recuperar mediante constantes simbólicas para mejorar la portabilidad de los programas:
  • El número máximo de hebras por proceso es 512. El número máximo de hebras se puede recuperar en el momento de la compilación utilizando la constante simbólica PTHREAD_THREADS_MAX definida en el archivo de cabecera pthread.h . Si una aplicación se compila con el distintivo -D_LARGE_THREADS , el número máximo de hebras por proceso es 32767.
  • El tamaño de pila mínimo para una hebra es 8 K. El tamaño de pila predeterminado es 96 KB. Este número se puede recuperar en el momento de la compilación utilizando la constante simbólica PTHREAD_STACK_MIN definida en el archivo de cabecera pthread.h .
    Nota: El tamaño máximo de pila es de 256 MB, el tamaño de un segmento. Este límite se indica mediante la constante simbólica PTHREAD_STACK_MAX en el archivo de cabecera pthread.h .
  • El número máximo de claves de datos específicas de hebra está limitado a 508. Este número se puede recuperar en el momento de la compilación utilizando la constante simbólica PTHREAD_KEYS_MAX definida en el archivo de cabecera pthread.h .

Valores de atributo predeterminados

Los valores predeterminados para el objeto de atributos de hebra se definen en el archivo de cabecera pthread.h mediante las siguientes constantes simbólicas:
  • El valor predeterminado para la constante simbólica DEFAULT_DETACHSTATE es PTHREAD_CREATE_DETACHED, que especifica el valor predeterminado para el atributo detachstate .
  • El valor predeterminado para la constante simbólica DEFAULT_JOINABLE es PTHREAD_CREATE_JOINABLE, que especifica el valor predeterminado para el estado de unión.
  • El valor predeterminado para la constante simbólica DEFAULT_INHERIT es PTHREAD_HERE_SCHED, que especifica el valor predeterminado para el atributo heresched .
  • El valor predeterminado para la constante simbólica DEFAULT_PRIO es 1, que especifica el valor predeterminado para lasched_priodel atributo schedparam .
  • El valor predeterminado para la constante simbólica DEFAULT_SCHED es SCHED_OTHER, que especifica el valor predeterminado para el atributo schedpolicy de un objeto de atributos de hebra.
  • El valor predeterminado para la constante simbólica DEFAULT_SCOPE es PTHREAD_SCOPE_LOCAL, que especifica el valor predeterminado para el atributo contention-scope .