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.

[sourcecode language=”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 conition varible 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;
}
[/sourcecode]

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.