/* Simple possible deadlock */ #include static pthread_mutex_t m1 = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t m2 = PTHREAD_MUTEX_INITIALIZER; static void *t1(void *v) { pthread_mutex_lock(&m1); pthread_mutex_lock(&m2); pthread_mutex_unlock(&m1); pthread_mutex_unlock(&m2); return 0; } static void *t2(void *v) { pthread_mutex_lock(&m2); pthread_mutex_lock(&m1); pthread_mutex_unlock(&m1); pthread_mutex_unlock(&m2); return 0; } int main() { pthread_t a, b; /* prevent spurious messages from the dynamic linker */ pthread_mutex_lock(&m1); pthread_mutex_unlock(&m1); pthread_create(&a, NULL, t1, NULL); pthread_create(&b, NULL, t2, NULL); pthread_join(a, NULL); pthread_join(b, NULL); return 0; }