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