Variables de condición para lograr la sincronización del hilo

(1) ¿Cuál es la variable de condición para lograr la sincronización de subprocesos?
  Si hay dos subprocesos en nuestro programa, uno es un subproceso productor y el otro es un subproceso consumidor. El subproceso productor escribe datos en el búfer de almacenamiento intermedio a intervalos. Y el hilo del consumidor toma datos del búfer de vez en cuando. Para evitar confusiones entre la lectura y la escritura de los dos hilos, dejamos que el hilo de producción termine de escribir y luego notificamos al consumidor que lea los datos, luego puede usar variables de condición para implementar el hilo Sincronización.

(2) Dos acciones de condición variable
  condición no se cumple:
  condición de subproceso bloqueado se cumple: notificar subproceso bloqueado para comenzar a trabajar

(3) Tipos de variables de condición:

pthread_cond_t cond;

(4) Función principal:
Inicializar una variable de condición (el segundo parámetro es generalmente NULL)

int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);

Destruye una variable de condición

int pthread_cond_destroy(pthread_cond_t *cond);

Bloqueo en espera de una variable de condición

int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);

       El hilo de bloqueo
       desbloquea el mutex bloqueado y desbloquea el mutex
       después de desbloquear

Espere una variable de condición por un tiempo limitado.

int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, const struct timespec *restrict abstime);

Active un subproceso en espera de esta condición. Cuando hay varios subprocesos en espera, active uno de ellos en el orden en cola.

int pthread_cond_signal(pthread_cond_t *cond);

Despierte todos los hilos bloqueados en variables de condición

int pthread_cond_broadcast(pthread_cond_t *cond);

 

(5) Precauciones

Nota 1: El
mutex mutex debe ser un bloqueo ordinario (PTHREAD_MUTEX_TIMED_NP) o un bloqueo adaptativo (PTHREAD_MUTEX_ADAPTIVE_NP).
Antes de llamar a pthread_cond_wait (), este hilo debe bloquear pthread_mutex_lock ().
El mutex permanece bloqueado hasta que se actualiza la cola de espera de condición.
Desbloquee antes de que el hilo cuelgue en espera.
Nota 2:
antes de que se cumpla la condición y deje pthread_cond_wait (), el mutex se volverá a bloquear para que se corresponda con
la acción de bloqueo antes de ingresar pthread_cond_wait ().
En otras palabras, antes de hacer pthread_cond_wait, a menudo es necesario usar pthread_mutex_lock para bloquear, y la
función pthread_cond_wait desbloqueará el bloqueo y luego suspenderá el hilo. Hasta que
pthread_cond_signal active la condición , la función restaurará el estado de bloqueo al estado bloqueado y
finalmente utilizará
pthread_mutex_unlock para desbloquear.

Nota 3:
pthread_cond_wait () y pthread_cond_timedwait () se implementan como puntos de cancelación, lo que significa que si
se cancela pthread_cond_wait (), se cierra el bloque, se restablece el estado de bloqueo y luego se termina el subproceso actual. Ese
bloqueo mutex ha vuelto al estado, pero el hilo actual ha sido cancelada, entonces el mutex no se resolverá, esta
vez el bloqueo no se libera, se producirá un callejón sin salida, por lo que requiere el hilo termina antes Desbloquéalo.

 

(5) Ejemplo

1.初始化条件变量和互斥锁
    pthread_mutex_init(&mutex, NULL);
    pthread_cond_init(&cond, NULL);

2.在线程中使用
(1)生产者线程
    pthread_mutex_lock(&mutex);// 使用互斥锁保护共享数据

    对缓冲区buffer写入操作
    
    pthread_cond_signal(&cond);// 通知阻塞的消费者线程,数据写入完毕,可以解除阻塞了
    pthread_mutex_unlock(&mutex);

(2)消费者线程
    pthread_mutex_lock(&mutex);  //调用pthread_cond_wait前一般都会搭配pthread_mutex_lock
    pthread_cond_wait(&cond, &mutex);    //等待生产者线程的通知
    从缓冲区buffer中读出数据
    pthread_mutex_unlock(&mutex);        //解锁

3.销毁条件变量和互斥锁
    pthread_mutex_destroy(&mutex);
    pthread_cond_destroy(&cond);

 

Artículos de referencia para este artículo:

https://www.cnblogs.com/hesper/p/10738996.html

https://www.cnblogs.com/harlanc/p/8596211.html

 

42 artículos originales publicados · Me gusta 10 · Visitantes más de 10,000

Supongo que te gusta

Origin blog.csdn.net/qq_37659294/article/details/104273874
Recomendado
Clasificación