La versión del paquete de hilos de nivel usuario Pthreads de Chris Provenzano (abreviadamente MIT Pthreads, Proven's Pthreads, o simplemente Pthreads) que se documenta en este manual es la versión 1.60 beta5 (local) que está disponible desde el 13 de Marzo de 1996 en la dirección sipb.mit.edu:/pub/pthreads, aunque también se puede encontrar en varios "mirrors" de Internet. Actualmente está disponible la versión 1.60 beta6 (local) desde el 16 de Noviembre de 1996, que corrige algunos bugs de la versión anterior, aunque no aporta ninguna funcionalidad nueva. También se pueden obtener en la misma dirección versiones anteriores del paquete, así como las sucesivas versiones que vayan apareciendo, dado que es un paquete que sigue en desarrollo. El código fuente de la versión 1.60 Beta 5, se puede obtener mediante los siguientes comandos del shell de UNIX :
ftp sibp.mit.edu cd /pub/pthreads bin get pthreads-1_60_beta5.tar.gz
De esta forma obtendremos el paquete fuente en formato comprimido mediante la utilidad gzip y archivado mediante la utilidad tar. Para descomprimirlo podemos emplear los siguientes comandos del shell de UNIX :
gunzip pthreads-1_60_beta5.tar.gz tar xvf pthreads-1_60_beta5.tar rm -f pthreads-1_60_beta5.tar
También se puede encontrar en otros formatos
según el servidor del que obtengamos el paquete, para lo
cual se deben realizar pasos similares a los anteriores pero empleando
el descompresor adecuado con su sintaxis correspondiente.
El paquete de hilos Proven's Pthreads que implementa el estándar POSIX 1003.1c sobre hilos se puede ejecutar en diversas plataformas, entre las que se encuentran las siguientes :
También se puede intentar instalar en otras
plataformas para lo cual se puede consultar el Manual del Responsable
del Sistema.
Pthreads 1.60 beta5 is Copyright (c) 1993, 1994, 1995, 1996 by Chris Provenzano and contributors, proven@mit.edu All rights reserved
.
El paquete de hilos de usuario Pthreads-1_60_beta5 consta de la siguiente estructura de directorios y archivos :
La estructura de directorios que presenta el paquete Pthreads 1.60 beta 5 tras descomprimir dicho paquete es la siguiente :
config Ficheros de configuración e instalación del paquete.
scripts Scripts para la creación del Makefile del paquete.
include Cabeceras de funciones del sistema para compilación.
|-> arpa Cabeceras de funciones de red para compilación.
|-> pthread Cabeceras de funciones pthreads para compilación
machdep Funciones dependientes de la plataforma.
pthreads Funciones implementadas del estándar POSIX.1c pthreads.
gen Funciones genéricas del sistema que serán reemplazadas.
net Funciones de red del sistema que serán reemplazadas.
stdio Librería STDIO hilo-segura.
stdlib Modificaciones a la librería STDLIB para hacerla hilo-segura.
string Modificaciones a la librería STRING para hacerla hilo-segura.
lib Algunas funciones de utilidad agregadas a la librería libpthread.a
tests Ejemplos de prueba y de rendimiento de la librería libpthread.a
bin Ejemplo: aplicación "finger"
en versión multihilo.
La estructura de directorios y archivos que se generan
una vez compilado el paquete en una máquina Intel 486 bajo
el sistema operativo Linux 1.2.3 (en otras máquinas es
idéntico, quizá con ligeras variaciones) es la que
se presenta a continuación :
include Ficheros cabecera del sistema
|-> arpa Cabeceras de funciones de red.
|-> pthread Cabeceras de funciones pthreads.
|-> sys Cabeceras de funciones básicas
del sistema.
Ficheros del directorio include :
dirent.h Cabeceras de funciones de gestión de directorios, modificadas
para la utilización de programación con hilos.
endian.h Definición del orden de almacenamiento de los bits según
sistema.
errno.h Declaración de funciones de error.
math.h Declaración de funciones matemáticas.
netdb.h Declaración de funciones de gestión de información de red.
Base de datos sobre la red.
pwd.h Declaración de funciones de gestión de password.
resolv.h Declaración de funciones de gestión del servidor de nombres
de dominio.
sched.h Declaración de funciones de gestión del planificador.
Cabecera PTHREAD básica.
signal.h Declaración de funciones de gestión de señales.
stdio.h Declaración de funciones de gestión de E/S de la librería STDIO.
stdlib.h Declaración de funciones de gestión estándar de la librería STDLIB.
string.h Declaración de funciones de gestión de cadenas (strings).
syslog.h Declaración de funciones de gestión de 'log' del sistema.
time.h Declaración de funciones de gestión del tiempo.
timers.h Declaración de funciones de gestión de relojes.
Cabecera PTHREAD básica.
tzfile.h Declaración de funciones de gestión de zonas de tiempo.
unistd.h Declaración de funciones estándar del sistema UNIX.
pthread.h Declaración de funciones de gestión de hilos.
Cabecera PTHREAD básica.
Ficheros del directorio include/arpa :
inet.h Declaración de funciones de gestión de internet.
nameser.h Declaración de funciones
de gestión del servidor de nombres internet.
Ficheros del directorio include/sys :
__math.h Declaración de valor HUGE para math.h
__path.h Declaración de rutas (paths) del sistema.
__signal.h Declaración de valores para gestión de señales.
__stdio.h Declaración de valores para stdio.h
__stdlib.h Declaración de valores para stdlib.h
__string.h Declaración de valores para string.h
__time.h Declaración del tiempo del sistema.
__unistd.h Declaración de valores para unistd.h
cdefs.h Declaración de valores para definiciones C.
compat.h Declaración de valores para compatibilidad.
dirent.h Declaración de valores para gestión de directorios.
errno.h Declaración de errno.
socket.h Corrección del fichero socket.h de LINUX
timers.h Declaración de valores para gestión de relojes.
uio.h Corrección del fichero uio.h de LINUX
wait.h Declaración de funciones de
espera "wait".
Ficheros del directorio include/pthread :
ac-types.h Definición de tipos especiales.
debug_out.h Macros para depuración de mensajes printf()
fd.h Declaración de estructuras de gestión de descriptores de fichero.
fd_pipe.h Definición del nuevo y veloz ITC pipe.
kernel.h Definición de características del kernel.
kthread.h Definición de características del kernel sobre hilos.
machdep.h Definición de características dependientes de la plataforma.
paths.h Definición de las rutas (paths) del sistema.
posix.h Definición de características POSIX.
sleep.h Declaración de funciones de gestión de sleep.
state.def Definición de los estados en los que se puede encontrar un hilo.
types.h Definición de tipos.
unistd.h Declaración de funciones estándar del sistema UNIX.
util.h Declaración de funciones de utilidad genéricas.
version.h Definición de valores indicativos de la versión del paquete PTHREADS.
xtypes.h Definición de tipos extendidos (actualmente vacío).
pthread_attr.h Definición de atributos de hilo.
cleanup.h Declaración de funciones de gestión de los gestores de limpieza.
cond.h Declaración de funciones de gestión de variables de condición.
mutex.h Declaración de funciones de gestión de mutex.
pthread_once.h Declaración de la función pthread_once (ejecución una sola vez).
specific.h Declaración de funciones de gestión de datos específicos de hilo.
prio_queue.h Declaración de funciones de gestión de las colas de prioridad.
queue.h Declaración de funciones
de gestión de la cola de hilos.
También se instalarán los ficheros
libpthread.a (librería del
paquete), pgcc y pg++
(compiladores) en los respectivos directorios que se indiquen
durante el proceso de instalación, aunque por defecto será
en el directorio /usr/local/pthreads.
Para construir Proven's Pthreads se necesita gcc (compilador GNU C de Free Software Foundation, Inc.) y gmake (utilidad GNU make de Free Software Foundation, Inc.) para todas las plataformas, excepto NetBSD, FreeBSD y BSDOS para las que se puede emplear gmake o pmake (la versión nativa de make).
Los pasos que se deben realizar para instalar Proven's Pthreads, empleando comandos del shell de UNIX, son los siguientes:
configure
make
make install
La compilación del paquete proporciona como salida la librería libpthread.a y los ejecutables pgcc y pg++, que corresponden a las versiones multihilo de los compiladores gcc y g++ de GNU. En realidad son scripts que facilitan la compilación, introduciendo los parámetros necesarios para compilar con la librería al compilador, sin que sea necesario que lo especifique el usuario.
El paquete se instala, por defecto, en el directorio
/usr/local/pthreads. Si se desea
otra localización se debe añadir la opción
--prefix=<dir> en configure,
aunque a continuación se presentan todas las opciones disponibles
en la utilidad de configuración.
Opciones de configure :
El programa de configuración configure ha sido creado mediante la herramienta autoconf 2.7 de Free Software Foundation, Inc. Este programa permite establecer una serie de parámetros que condicionarán la instalación. La sintaxis y los parámetros que se pueden configurar son los siguientes
Sintaxis : configure [options] [host]
Opciones : [opciones por defecto entre corchetes tras las descripciones]
--cache-file=FILE Fichero cache de comprobación en FILE [./config.cache]
--help Presenta la ayuda de configure
--no-create No crea fichero de salida
--quiet, --silent No imprime los mensajes `checking...'
--version Imprime la versión de autoconf que creó configure
--prefix=PREFIX Instala los ficheros independientes de la arquitectura en el directorio PREFIX. [$ac_default_prefix] [/usr/local/pthreads]
--exec-prefix=EPREFIX Instala los ficheros dependientes de la arquitectura en el directorio EPREFIX [igual que prefix]
--bindir=DIR Ejecutables de usuario en DIR [EPREFIX/bin]
--sbindir=DIR Ejecutables del sistema en DIR [EPREFIX/sbin]
--libexecdir=DIR Librerías ejecutables en DIR [EPREFIX/libexec]
--datadir=DIR Datos sólo-lectura independientes de la arquitectura en DIR [PREFIX/share]
--sysconfdir=DIR Datos sólo-lectura de la máquina en DIR [PREFIX/etc]
--sharedstatedir=DIR Datos modificables independientes de la arquitectura en DIR [PREFIX/com]
--localstatedir=DIR Datos modificables de la máquina en DIR [PREFIX/var]
--libdir=DIR Librería de código objeto en DIR [EPREFIX/lib]
--includedir=DIR Ficheros de cabeceras C en DIR [PREFIX/include]
--oldincludedir=DIR Ficheros de cabeceras C para no-gcc en DIR [/usr/include]
--infodir=DIR Información de documentación en DIR [PREFIX/info]
--mandir=DIR Manual de documentación en DIR [PREFIX/man]
--srcdir=DIR Lugar de los fuentes en DIR [configure dir or ..]
--program-prefix=PREFIX Antepone PREFIX a los nombres de programas instalados
--program-suffix=SUFFIX Añade SUFFIX a los nombres de programas instalados
--program-transform-name=PROGRAM Ejecuta el filtro PROGRAM en los nombres de programas instalados.
--build=BUILD configure para construir en BUILD [BUILD=HOST]
--host=HOST configure para HOST [guessed]
--target=TARGET configure para destino TARGET [TARGET=HOST]
--disable-FEATURE No incluir la característica FEATURE (igual que --enable-FEATURE=no)
--enable-FEATURE[=ARG] incluir característica FEATURE [ARG=yes]
--with-PACKAGE[=ARG] utilizar el paquete PACKAGE [ARG=yes]
--without-PACKAGE no utilizar el paquete PACKAGE (igual que --with-PACKAGE=no)
--x-includes=DIR Ficheros X a incluir en DIR
--x-libraries=DIR Ficheros X de librería
en DIR
Junto con el paquete original, se ha desarrollado una serie de páginas de manual en línea según el formato de la utilidad man de los sistemas UNIX. Las páginas del manual corresponden a las funciones más importantes que implementa el paquete y que suele emplear el programador (todas las funciones del paquete que no son internas). Para poder disponer de la ayuda en línea se deben instalar las páginas de manual en el directorio adecuado para la sección 3 del manual (lugar habitual para el estándar POSIX.1c en la mayoría de los sistemas). Con el fin de facilitar la instalación se entregan las páginas del manual en un fichero comprimido con tar y gzip llamado man.tgz. El proceso de instalación es el siguiente:
gunzip man.tgz tar xvf man.tar rm -f man.tar make install
Por defecto se instalarán en el directorio
/usr/man/man3. Si se desea especificar
otro directorio concreto, basta modificar el Makefile que acompaña
a las páginas del manual.
Durante el proceso de instalación podemos
encontrarnos con diversos problemas. Algunos de los más
frecuentes se presentan a continuación, aunque si el problema
de instalación concreto no aparece en la lista de los indicados
se puede consultar en los FAQs sobre el paquete, en el grupo de
noticias comp.programming.threads,
o bien, consultando o remitiendo el problema a la lista de correo
sobre errores relacionados con el paquete pthreads-bugs@mit.edu
o bien pthreads@mit.edu.
1) El paquete no se puede compilar.
Causa : El sistema no posee la utilidad gmake o falta el compilador gcc.
Solución : Localice la versión de gmake y gcc adecuada a su sistema en cualquier servidor de ftp anónimo e instálelos.
2) El paquete inicia la compilación pero se detiene inmediatamente con errores.
Causa : El sistema en el que compilamos existe gcc pero faltan la librerías de C++ o bien la versión de gcc instalada no es la adecuada.
Solución : Instalar primeramente el paquete gcc completo y de forma adecuada y volver a compilar Pthreads.
Recomendación : Emplear una versión de gcc lo suficientemente reciente : 2.6.5 o posterior.
3) El paquete parece compilar pero a mitad de camino se detiene con errores.
Causa : Puede ser que exista alguna librería no encontrada (no especificada en el path) o puede que alguno de los archivos del paquete redefina alguna estructura de su sistema.
Solución : Indique adecuadamente las rutas de las librerías en el programa configure o en su path. Si el problema persiste puede ser necesario revisar el fichero Makefile generado por la utilidad configure, o bien indicarla específicamente el sistema para el que desea generar un Makefile. En otro caso el problema es más difícil de resolver.
4) No se pueden compilar los programas de ejemplo.
Causa : El paquete ha compilado sin problemas, pero el directorio destino de la librería libpthread.a no corresponde al esperado por los ejemplos del paquete, o bien los permisos de usuario de acceso a la librería o a los ficheros de cabecera del paquete no son los adecuados.
Solución : Compruebe el directorio donde se encuentra la librería y los ficheros de cabecera, así como los permisos de acceso, y modifique los Makefile's de los ejemplos si es necesario.
5) Los programas de ejemplo no funcionan y el proceso se "cuelga".
Causa : El paquete parece estar bien instalado, pero al ejecutar un mútex o variable de condición alguno de los módulos produce un deadlock.
Solución :
Revise la forma en la que realizó la instalación
del paquete. Si el problema persiste puede ser que su sistema
no esté soportado o que exista un bug en el paquete en
relación a su sistema.