#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
pthread_mutex_t contended_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t control_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t control_condition;
pthread_mutex_t thread_started_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t thread_started_condition;
void *
lock_acquirer_1 (void *input)
{
pthread_mutex_lock (&contended_mutex);
pthread_mutex_lock (&thread_started_mutex);
pthread_mutex_unlock(&thread_started_mutex);
pthread_mutex_lock (&control_mutex);
pthread_cond_signal (&thread_started_condition);
pthread_cond_wait (&control_condition, &control_mutex);
pthread_mutex_unlock (&contended_mutex);
return NULL;
}
int
call_me_to_get_lock ()
{
pthread_cond_signal (&control_condition);
pthread_mutex_lock (&contended_mutex);
return 567;
}
int main ()
{
pthread_t thread_1;
pthread_cond_init (&control_condition, NULL);
pthread_cond_init (&thread_started_condition, NULL);
pthread_mutex_lock (&thread_started_mutex);
pthread_create (&thread_1, NULL, lock_acquirer_1, NULL);
pthread_cond_wait (&thread_started_condition, &thread_started_mutex);
pthread_mutex_lock (&control_mutex);
pthread_mutex_unlock (&control_mutex);
call_me_to_get_lock();
pthread_join (thread_1, NULL);
return 0;
}