Условное ожидание и сигнал в многопоточности

Опубликовано: 16 Февраля, 2022

Что такое условное ожидание и сигнал в многопоточности?
Объяснение: Если вы хотите приостановить поток, можно использовать переменную условия. В C под Linux есть функция pthread_cond_wait () для ожидания или ожидания.
С другой стороны, есть функция pthread_cond_signal () для пробуждения спящего или ожидающего потока.
Потоки могут ждать переменной условия.

Предпосылка: многопоточность

Синтаксис pthread_cond_wait ():

int pthread_cond_wait (pthread_cond_t * ограничить условие, 
                   pthread_mutex_t * ограничить мьютекс);

Параметр:

cond: условная переменная
мьютекс: блокировка мьютекса 

Возвращаемое значение:

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

Функция pthread_cond_wait () снимает блокировку, указанную мьютексом, и ожидает выполнения переменной условия cond.
Синтаксис pthread_cond_signal ():

int pthread_cond_signal (pthread_cond_t * cond);

Параметр:

cond: условная переменная

Возвращаемое значение:

В случае успеха возвращается 0; в противном случае номер ошибки
должен быть возвращен, чтобы указать на ошибку. 

Функция pthread_cond_signal () пробуждает потоки, ожидающие переменной условия.
Примечание: две вышеуказанные функции работают вместе.

Рекомендуется: сначала попробуйте свой подход в {IDE}, прежде чем переходить к решению.

Below is the implementation of condition, wait and signal functions.

// 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 conition variable cond1
        done = 2;
        printf("Waiting on condition variable cond1 ");
        pthread_cond_wait(&cond1, &lock);
    }
    else {
  
        // Let"s signal condition variable cond1
        printf("Signaling condition variable cond1 ");
        pthread_cond_signal(&cond1);
    }
  
    // release lock
    pthread_mutex_unlock(&lock);
  
    printf("Returning thread ");
  
    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;
}

Выход :


Хотите узнать о лучших видео и практических задачах, ознакомьтесь с Базовым курсом C для базового и продвинутого C.