Академический Документы
Профессиональный Документы
Культура Документы
Objetivos
Explorar las funciones de la librera Pthreads para crear y
sincronizar hilos
pthread_create
int pthread_create(tid, attr, function, arg);
pthread_t *tid
void *(*function)(void *)
void *arg
pthread_create Detalles
Inicia un hilo ejecutando la funcin
Descriptor del hilo retornado por medio de la estructura
pthread_t
Especifica NULL para usar los atributos por default
Un solo argumento enviado a la funcin
Si no tiene argumentos, especifica NULL
Verificar cdigos de error!
Qu sucede?
6
Esperando un Thread
int pthread_join(tid, val_ptr);
pthread_t tid
void **val_ptr
pthread_join Detalles
Un hilo espera a que un hilo con descriptor tid termine
Solo espera a que un hilo se una
El hilo debe ser unible
Un valor de salida se devuelve del hilo unido
Tipo devuelto es (void *)
Usar NULL si no se espera un valor de retorno
Estados de un hilo
Los hilos Pthread tienen dos estados
Unible (joinable)
Desacoplado (detached)
Por default los hilos son unibles
Los recursos se mantienen hasta el pthread_join
Pueden ser reseteados con atributos o una llamada API
Los hilos desacoplados no pueden unirse
Los recursos pueden reclamarse en la terminacin
No se pueden resetear a ser unibles
10
Qu falla?
Qu se muesta de myNum?
void *threadFunc(void *pArg
) {
*
int* p = (int*)pArg;
int myNum = *p;
printf( Thread number %d\n, myNum);
}
. . .
// from main():
for (int i = 0; i < numThreads; i++) {
pthread_create(&tid[i], NULL, threadFunc, &i);
}
11
for(int i=0;i<numThreads;i++) {
pthread_create(&tid[i], NULL, thread, (void *) &i);
}
12
0
1
0x0001004
p=0x000100C
mynum=0x0001010
13
pthread_mutexattr_t
Atributos de mutex
14
pthread_mutex_init
int pthread_mutex_init( mutex, attr );
pthread_mutex_t *mutex
Inicializacin Alternativa
Puede usarse el inicializador esttico
PTHREAD_MUTEX_INITIALIZER
pthread_mutex_t mtx1 = PTHREAD_MUTEX_INITIALIZER;
Usa los atributos por default
16
pthread_mutex_lock
int pthread_mutex_lock( mutex );
pthread_mutex_t *mutex
mutex que intenta hacer el lock
17
pthread_mutex_lock Detalles
Intenta hacer el lock del mutex
Si el mutex est bloqueado por otro hilo, el hilo que llama al
lock se bloquea
Mutex es detenido por el hilo que lo llama hasta que se
desbloquea
Mutex lock/unlock deben ser pares, si no puede ocurrir un
interbloqueo
pthread_mutex_unlock
int pthread_mutex_unlock( mutex );
pthread_mutex_t *mutex
20
Variables Condicin
Los semforos son condicionales en el contador del semforo
Las variables condicin estn asociadas con una condicin
arbitraria
Las mismas operaciones: wait y signal
Proveen exclusin mutua
21
22
23
adquiere mutex;
El mutex se libera
while (condicin es verdadera)
automticamente
cuando el hilo espera
espera en la variable de condicin;
ejecuta regin crtica;
actualiza condicin;
Puede
ser
enva seal a los hilos que esperan;
opcional
libera mutex;
24
Variables Condicin
pthread_cond_init, pthread_cond_destroy
Inicializa/destruye variables de condicin
pthread_cond_wait
El hilo duerme hasta que se efecta un signal a la variable de
condicin
pthread_cond_signal
Seal que libera la variable de condicin
pthread_cond_broadcast
Broadcast que libera la variable de condicin
25
pthread_cond_t
La variable de condicin
pthread_condattr_t
Atributos de la variable de condicin
26
pthread_cond_init
int pthread_cond_init( cond, attr );
pthread_cond_t *cond
Inicializacin alternativa
Puede usuarse un inicializador esttico
PTHREAD_COND_INITIALIZER
pthread_cond_t cond1 = PTHREAD_COND_INITIALIZER;
Usa los atributos por default
28
pthread_cond_wait
int pthread_cond_wait( cond, mutex );
pthread_cond_t *cond
Variable condicin a esperar
pthread_mutex_t *mutex
Debe desbloquearse
29
pthread_cond_wait Detalles
El hilo se bloquea esperando una seal en cond
El mutex se desbloquea
Permite que otros hilos adquiran el lock
Cuando llega una seal, el mutex ser readquirido antes de
salir del pthread_cond_wait
pthread_cond_signal
int pthread_cond_signal( cond );
pthread_cond_t *cond
Variable condicin a la que se le enviar la seal
31
pthread_cond_signal Detalles
Enva una seal a una variable condicin, desbloquea un hilo
bloqueado
Si no hay hilos esperando, no se toma ninguna accin
La seal no se guarda para futuros hilos
El hilo que enva la seal no requiere tener el mutex
Puede ser ms eficiente
Puede haber problemas si se usan prioridades de hilos
pthread_cond_broadcast
int pthread_cond_broadcast( cond );
pthread_cond_t *cond
variable condicin a recibir la seal
33
pthread_cond_broadcast detalles
Desbloquea todos los hilos que estn esperando una variable de
condicin
Si no hay hilos esperando, no se toma ninguna accin
Broadcast no se almacena para hilos futuros
El hilo que enva la seal no necesita tener el mutex
34
35
36