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 del objeto de atributos de hebra
- pthread_attr_getstacksize devuelve el valor del atributo
- y las subrutinas pthread_attr_setstacksize establecen el valor
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.
- 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.
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 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
#ifndef _POSIX_THREAD_ATTR_STACKSIZE
#error "The stack size POSIX option is required"
#endif- _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
- _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
- 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
- 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
- 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 .