/* Simple possible deadlock */
#include <pthread.h>

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;
}