¿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: