Условное ожидание и сигнал в многопоточности
Что такое условное ожидание и сигнал в многопоточности?
Объяснение: Если вы хотите приостановить поток, можно использовать переменную условия. В 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.