1 // Naive dining philosophers solution, which leads to deadlock.
12 pthread_mutex_t *left_fork;
13 pthread_mutex_t *right_fork;
16 static void * philosopher_doit(void *forks_arg) {
17 struct forks *forks = forks_arg;
18 pthread_mutex_lock(forks->left_fork);
19 pthread_mutex_lock(forks->right_fork);
21 if(DEBUG) printf("Philosopher %d just ate.\n", forks->philosopher);
23 pthread_mutex_unlock(forks->left_fork);
24 pthread_mutex_unlock(forks->right_fork);
28 int main(int argc, char* argv[]) {
30 printf("Usage: %s NUM_PHILOSOPHERS DEBUG\n", argv[0]);
34 int NUM_THREADS = atoi(argv[1]);
35 DEBUG = atoi(argv[2]);
37 pthread_t thread[NUM_THREADS];
38 pthread_mutex_t mutex_resource[NUM_THREADS];
40 forks = malloc(NUM_THREADS * sizeof(struct forks));
43 for (i = 0; i < NUM_THREADS; i++) {
44 pthread_mutex_init(&mutex_resource[i], NULL);
45 forks[i] = (struct forks){i,
46 &mutex_resource[i], &mutex_resource[(i+1) % NUM_THREADS]};
49 for (i = 0; i < NUM_THREADS; i++) {
50 pthread_create(&thread[i], NULL, &philosopher_doit, &forks[i]);
53 for (i = 0; i < NUM_THREADS; i++) {
54 pthread_join(thread[i], NULL);