1
2#include <pthread.h>
3#include <stdlib.h>
4#include <unistd.h>
5#include <assert.h>
6/* Naive dining philosophers with inconsistent lock acquisition
7   ordering. */
8
9static pthread_t phil[5];
10static struct {
11   pthread_mutex_t m;
12   char pad[120 - sizeof(pthread_mutex_t)];
13} chop[5];
14
15void* dine ( void* arg )
16{
17   int i;
18   long left = (long)arg;
19   long right = (left + 1) % 5;
20   for (i = 0; i < 1000/*arbitrary*/; i++) {
21      pthread_mutex_lock(&chop[left].m);
22      pthread_mutex_lock(&chop[right].m);
23      /* eating */
24      pthread_mutex_unlock(&chop[left].m);
25      pthread_mutex_unlock(&chop[right].m);
26   }
27   return NULL;
28}
29
30int main ( void )
31{
32   long i;
33   assert(sizeof(pthread_mutex_t) <= 120);
34
35   for (i = 0; i < 5; i++)
36      pthread_mutex_init( &chop[i].m, NULL);
37
38   for (i = 0; i < 5; i++)
39      pthread_create(&phil[i], NULL, dine, (void*)i );
40
41   sleep(1);
42
43   for (i = 0; i < 5; i++)
44      pthread_join(phil[i], NULL);
45
46   return 0;
47}
48