pthread_cond_destroy(pthread_cond_t *cond);
int pthread_cond_init(pthread_cond_t *restrict cond,
const pthread_condattr_t *restrict attr);
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex,
const struct timespec *restrict abstime);
int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);
int pthread_cond_broadcast(pthread_cond_t *cond);
int pthread_cond_signal(pthread_cond_t *cond)
El funcionamiento es sencillo, una hebra obtiene un mutex, comprueba la condición bajo la protección del mutex y si la condición es cierta la hebra continua su tarea y libera el mutex cuando sea apropiado. Si la condición no es cierta el mutex se libera y la hebra se duerme sobre la variable condición. Cuando se produce un cambio en la condición se deberá producir una llamada que despierte la hebra dormida. por último la hebra despertada vuelve a tomar el mutex y repite el procedimiento mencionado anteriormente.
Mostrando entradas con la etiqueta mutex. Mostrar todas las entradas
Mostrando entradas con la etiqueta mutex. Mostrar todas las entradas
jueves, 6 de febrero de 2014
[Threads] Regiones críticas
POSIX ofrece diversos mecanismos para interactuar con las regiones críticas entre hebras, nosotros nos centraremos en uno de los más sencillos e intuitivos, el mutex.
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);
int pthread_mutexattr_init(pthread_mutexattr_t *attr);
Si los attr son NULL, será un mutex con atributos por defecto. Se inicializa a desbloqueado y además debemos destruirlo a desbloqueado.
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
La función "pthread_mutex_trylock" intenta tomar un mutex. Si ya está bloqueado se devuelve un código de error EBUSY (puede resultar útil para evitar condiciones de deadlock).
Al intentar desbloquear se pueden devolver dos tipos de errores:
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);
int pthread_mutexattr_init(pthread_mutexattr_t *attr);
Si los attr son NULL, será un mutex con atributos por defecto. Se inicializa a desbloqueado y además debemos destruirlo a desbloqueado.
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
La función "pthread_mutex_trylock" intenta tomar un mutex. Si ya está bloqueado se devuelve un código de error EBUSY (puede resultar útil para evitar condiciones de deadlock).
Al intentar desbloquear se pueden devolver dos tipos de errores:
- Si el mutex ya está desbloqueado.
- Si el mutex está tomado por otra hebra.
Suscribirse a:
Entradas (Atom)