Hye! I saw this code on geeks for geeks. But I am not able to fully get it.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
// 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;
}
|
The basic concept which I want to understand is how a Thread should not continue its work until another thread finishes its work. But I am not able to identify this concept in this code.
This is what I know so far:
1) pthread_create(&tid1, NULL, foo, NULL);
This means that a thread is created for the function "foo" to get executed. We can say that thread is a Box, inside which foo is there which will decide the operation.
2) Foo execution starts with respect to thread 1!
pthread_mutex_lock(&lock) : A lock is acquired
3) If condition (I am not getting this)
if (done == 1):
I think this means that if thread 1 has completed its work then send a signal to someone who is waiting for this condition : pthread_cond_wait(&cond1, &lock);
else:
If work hasn't been done than send a signal to wake up.
Now my question is: To whom it is sending these signal?? Cuz thread 2 is not yet in the scene.
4) sleep(1) : Why we are setting it to sleep when pthread_cond_wait(&cond1, &lock)itself is a sleep condition for the thread.
Same goes with thread 2. I am not able to link the concept.