#include #include #include pthread_mutex_t the_mutex; pthread_mutex_t another_mutex; void *a_run(void* p){ pthread_mutex_lock(&the_mutex); printf("a: In critical section\n"); sleep(8); pthread_mutex_unlock(&another_mutex); pthread_mutex_lock(&another_mutex); sleep(2); pthread_mutex_unlock(&the_mutex); printf("a: Done with lock\n"); } void *b_run(void* p){ pthread_mutex_lock(&another_mutex); sleep(1); printf("b: Ready to enter critical section\n"); pthread_mutex_lock(&the_mutex); printf("b: In critical section\n"); sleep(5); pthread_mutex_unlock(&another_mutex); pthread_mutex_unlock(&the_mutex); printf("b: Done now\n"); } int main(){ pthread_t a, b; pthread_mutex_init(&the_mutex, 0); pthread_mutex_init(&another_mutex, 0); pthread_create(&a, 0, a_run, 0); pthread_create(&b, 0, b_run, 0); pthread_join(a, 0); printf("a has joined\n"); pthread_join(b, 0); printf("Both threads joined\n"); return 0; }