This is just a program to show the use of conditional variables when two threads are involved. One thread wants a non-zero value of count
, and other thread is responsible for signaling it when the count is non-zero.
Is there something in this code which still needs an improvement? Is there something which could have been done in a better way?
#include <iostream>
/* Declaration of a Mutex variable `mutexA`. */
pthread_mutex_t mutexA;
/* Declaration of a Condition Variable `conditionVariableA`. */
pthread_cond_t conditionVariableA;
/* `functionA` and `functionB` are the argument functions of the two threads (declared
below) */
void* functionA (void*);
void* functionB (void*);
/* `count` is the variable shared between threads `A` and `B`.
Thread `A` wants it to be non zero. Thread `B` will be responsible for making it
non-zero and then issuing a signal. */
int count = -100;
int main ()
{
// Declaration of two threads namely `A`, and `B`.
pthread_t A, B;
// Initializing the mutex lock to be shared between the threads.
pthread_mutex_init (&mutexA, NULL);
/* The function `pthread_cond_init()` initialises the Condition Variable referenced by
variable `conditionVariableA` with attributes referenced by variable `attributes`. If
`attributes` is NULL, the default condition variable attributes are used. */
pthread_cond_init (&conditionVariableA, NULL);
/* Definition of two threads namely A and B */
pthread_create (&A, NULL, functionA, NULL);
pthread_create (&B, NULL, functionB, NULL);
pthread_join (A, NULL);
pthread_join (B, NULL);
}
void* functionA (void* argA)
{
while (1)
{
pthread_mutex_lock (&mutexA);
if (count <= 0)
{
std :: cout << "\ngnitiaW!\n";
pthread_cond_wait (&conditionVariableA, &mutexA);
}
else
{
// Do something.
std :: cout << "\nTime to enjoy!\n";
return 0;
}
pthread_mutex_unlock (&mutexA);
}
return 0;
}
void* functionB (void* argB)
{
while (1)
{
pthread_mutex_lock (&mutexA);
count++;
if (count > 0)
{
pthread_cond_signal (&conditionVariableA);
std :: cout << "\nSignaled!\n";
return 0;
}
else
{
std :: cout << "\nNot signaled yet!";
}
pthread_mutex_unlock (&mutexA);
}
return 0;
}