Programación en posix threads (pthreads)

Solo disponible en BuenasTareas
  • Páginas : 6 (1329 palabras )
  • Descarga(s) : 0
  • Publicado : 4 de noviembre de 2011
Leer documento completo
Vista previa del texto
1. Programación en POSIX Threads (Pthreads)
1.1. Introducción
La librería de pthreads es una librería que cumple los estándares POSIX y que nos permite trabajar con distintos hilos de ejecución (threads) al mismo tiempo. La diferencia entre un thread y un proceso es que los procesos no comparten memoria entre sí, a no ser que se haya declarado explicitamente usando alguno de los mecanismos deIPC (InterProcess Communication) de Unix, mientras que los threads sí que comparten totalmente la memoria entre ellos. Ademas, para crear threads se usan las funciones de la librería pthread o de cualquier otra que soporte threads mientras que para crear procesos usaremos la llamada al sistema fork(), que se encuentra en todos los sistemas unix. Ya que pthreads es una librería POSIX, se podranportar los programas hechos con ella a cualquier sistema operativo POSIX que soporte threads. Ejemplos de ello son IRIX, los unix'es de BSD, Digital Unix OSF/1, etc.

1.2. Como compilar un programa con pthreads
Para crear programas que hagan uso de la librería pthreads necesitamos, en primer lugar, la librería en sí. Ésta viene en la mayoría de distribuciones linux, y seguramente se instale almismo tiempo que los paquetes incluidos para el desarrollo de aplicaciones (es decir, cuando instalamos la libc o algun paquete tipo libc-devel) Si no es así, o usais un sistema que no sea linux, la librería no debería ser muy difícil de encontrar en la red, porque es bastante conocida y se suele usar bastante. Una vez tenemos la librería instalada, deberemos compilar el programa y linkarlo con lalibrería dependiendo del compilador que estemos usando. La forma más usual de hacer esto es, si estamos usando como compilador GNU gcc con el comando: gcc programa_con_pthreads.c -o programa_con_pthreads -lpthread Si por el contrario no estamos usando el compilador de GNU, lo mejor sera que miremos la pagina man del compilador de C instalado en el sistema. Por ejemplo, en el caso del compilador deDigital para OSF/1, éste tiene un parámetro especial para compilar con pthreads: cc programa_con_pthreads.c -o programa_con_pthreads -pthread Como véis la sintaxis no es muy diferente pero el compilador de Digital no aceptará la de gcc y viceversa.

1.3. Creación y manipulación de threads
Para crear un thread nos valdremos de la funcion pthread_create de la librería y de la estructura de datospthread_t que identifica cada thread diferenciandolo de los demas y

que contiene todos sus datos. El prototipo de la función es el siguiente: int pthread_create(pthread_t * thread, pthread_attr_t *attr, void * (*start_routine)(void *), void *arg) • thread: Es una variable del tipo pthread_t que contendrá los datos del thread y que nos servirá para identificar el thread en concreto cuando nosinterese hacer llamadas a la libreria para llevar a cabo alguna acción sobre él. • attr: Es un parámetro del tipo pthread_attr_t y que se debe inicializar previamente con los atributos que queramos que tenga el thread. Entre los atributos hay la prioridad, el quantum, el algoritmo de planificación que queramos usar, etc. Si pasamos como parámetro aquí NULL, la librería le asignará al thread unosatributos por defecto (RECOMENDADO). • start_routine: Aquí pondremos la dirección de la función que queremos que ejecute el thread. La función debe devolver un puntero genérico (void *) como resultado, y debe tener como único parámetro otro puntero genérico. La ventaja de que estos dos punteros sean genéricos es que podremos devolver cualquier cosa que se nos ocurra mediante los castings de tiposnecesarios. Si necesitamos pasar o devolver más de un parámetro a la vez, se puede crear una estructura y meter allí dentro todo lo que necesitemos. Luego pasaremos o devolveremos la dirección de esta estructura como único parámetro. (ver código de ejemplo) • arg: Es un puntero al parámetro que se le pasará a la función. Puede ser NULL si no queremos pasarle nada a la función. • En caso de que todo...
tracking img