CS 220 Parallel Computing

deadlock.c

DownloadView Raw

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

pthread_mutex_t mutex_score = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mutex_counter = PTHREAD_MUTEX_INITIALIZER;
int score = 0;
int counter = 0;

void *thread_func1(void *arg) {
    while (counter < 1000000) {
        pthread_mutex_lock(&mutex_score);
        pthread_mutex_lock(&mutex_counter);
        counter++;
        score++;
        pthread_mutex_unlock(&mutex_score);
        pthread_mutex_unlock(&mutex_counter);
        printf("Score: %d\n", score);
    }
    return 0;
}

void *thread_func2(void *arg) {
    while (counter < 1000000) {
        pthread_mutex_lock(&mutex_counter);
        pthread_mutex_lock(&mutex_score);
        score--;
        counter++;
        pthread_mutex_unlock(&mutex_counter);
        pthread_mutex_unlock(&mutex_score);
        printf("Score: %d\n", score);
    }
    return 0;
}

int main(int argc, char* argv[]) {
    pthread_t thread1, thread2;
    pthread_create(&thread1, NULL, thread_func1, NULL);
    pthread_create(&thread2, NULL, thread_func2, NULL);
    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);
    printf("Thread %d wins!\n", score > 0 ? 1 : 2);
    return 0;
}