Espera condicional y señal en subprocesos múltiples

¿Qué son la espera condicional y la señal en subprocesos múltiples?  
Explicación: cuando desea dormir un subproceso, se puede usar la variable de condición. En C bajo Linux, hay una función pthread_cond_wait() para esperar o dormir. 
Por otro lado, hay una función pthread_cond_signal() para despertar un hilo en espera o dormido. 
Los subprocesos pueden esperar en una variable de condición. 

Requisito previo: subprocesamiento múltiple

Sintaxis de pthread_cond_wait() : 

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

Parámetro:  

cond : condition variable
mutex : is mutex lock 

Valor de retorno:  

On success, 0 is returned ; otherwise, an error 
number shall be returned to indicate the error. 

El pthread_cond_wait() libera un bloqueo especificado por mutex y espera en la variable cond de condición. 

Sintaxis de pthread_cond_signal() :  

int pthread_cond_signal(pthread_cond_t *cond);

Parámetro: 

cond : condition variable

Valor de retorno:  

On success, 0 is returned ; otherwise, an error number
shall be returned to indicate the error. 

El pthread_cond_signal() activa subprocesos que esperan la variable de condición. 

Nota: Las dos funciones anteriores funcionan juntas. 

A continuación se muestra la implementación de las funciones de condición, espera y señal.  

C

// C program to implement cond(), signal()
// and wait() functions
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
 
// Declaration of thread condition variable
pthread_cond_t cond1 = PTHREAD_COND_INITIALIZER;
 
// declaring mutex
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
 
int done = 1;
 
// Thread function
void* foo()
{
 
    // acquire a lock
    pthread_mutex_lock(&lock);
    if (done == 1) {
 
        // let's wait on condition variable cond1
        done = 2;
        printf("Waiting on condition variable cond1\n");
        pthread_cond_wait(&cond1, &lock);
    }
    else {
 
        // Let's signal condition variable cond1
        printf("Signaling condition variable cond1\n");
        pthread_cond_signal(&cond1);
    }
 
    // release lock
    pthread_mutex_unlock(&lock);
 
    printf("Returning thread\n");
 
    return NULL;
}
 
// Driver code
int main()
{
    pthread_t tid1, tid2;
 
    // Create thread 1
    pthread_create(&tid1, NULL, foo, NULL);
 
    // sleep for 1 sec so that thread 1
    // would get a chance to run first
    sleep(1);
 
    // Create thread 2
    pthread_create(&tid2, NULL, foo, NULL);
 
    // wait for the completion of thread 2
    pthread_join(tid2, NULL);
 
    return 0;
}

Producción: 
 

Publicación traducida automáticamente

Artículo escrito por Sacheen y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *