1/* Simple possible deadlock */ 2#include <pthread.h> 3 4static pthread_mutex_t m1 = PTHREAD_MUTEX_INITIALIZER; 5static pthread_mutex_t m2 = PTHREAD_MUTEX_INITIALIZER; 6 7static void *t1(void *v) 8{ 9 pthread_mutex_lock(&m1); 10 pthread_mutex_lock(&m2); 11 pthread_mutex_unlock(&m1); 12 pthread_mutex_unlock(&m2); 13 14 return 0; 15} 16 17static void *t2(void *v) 18{ 19 pthread_mutex_lock(&m2); 20 pthread_mutex_lock(&m1); 21 pthread_mutex_unlock(&m1); 22 pthread_mutex_unlock(&m2); 23 24 return 0; 25} 26 27int main() 28{ 29 pthread_t a, b; 30 31 /* prevent spurious messages from the dynamic linker */ 32 pthread_mutex_lock(&m1); 33 pthread_mutex_unlock(&m1); 34 35 pthread_create(&a, NULL, t1, NULL); 36 pthread_create(&b, NULL, t2, NULL); 37 38 pthread_join(a, NULL); 39 pthread_join(b, NULL); 40 41 return 0; 42} 43 44