Conditional wait and signal in multi-threading

What are conditional wait and signal in multi-threading ?
Explanation: When you want to sleep a thread, condition variable can be used. In C under Linux, there is a function pthread_cond_wait() to wait or sleep.
On the other hand, there is a function pthread_cond_signal() to wake up sleeping or waiting thread.
Threads can wait on a condition variable.

Prerequisite : Multithreading

Syntax of pthread_cond_wait() :



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

Parameter :

cond : condition variable
mutex : is mutex lock 

Return Value :

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

The pthread_cond_wait() release a lock specified by mutex and wait on condition cond variable.
Syntax of pthread_cond_signal() :

int pthread_cond_signal(pthread_cond_t *cond);

Parameter :

cond : condition variable

Return Value :

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

The pthread_cond_signal() wake up threads waiting for the condition variable.
Note : The above two functions works together.

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

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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\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;
}

chevron_right


Output :




My Personal Notes arrow_drop_up

Hello I am Sacheen Birhade from Pune I have 7+ years of experience in enterprise Software Development I holds two master degrees viz MCA and MSc Computer Science I am enthusiastic about programming data structure Linux System Programming and Multithreading You can reach me at spbirhade[at]gmail[dot

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : nidhi_biet