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