CS 220 Parallel Computing

busywait.c

DownloadView Raw

/* File:
 *    busywait.c
 *
 * Purpose:
 *    Illustrate busy waiting.
 *
 * Input:
 *    none
 * Output:
 *    message from each thread as the shared variable is incremented, followed
 *    by the total at the end.
 *
 * Compile:  gcc -g -Wall -o busywait busywait.c -lpthread
 * Usage:
 *    ./busywait <thread_count>
 */

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

/* Global variable: accessible to all threads */
int num_threads;
int shared_var = 1;
int current_turn = 0;

pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;

void *thread_function(void * thread_number);

int main(int argc, char* argv[]) {

    if (argc != 2) {
        printf("usage: %s <number of threads>\n", argv[0]);
        return EXIT_SUCCESS;
    }

    num_threads = atoi(argv[1]);
    if (num_threads <= 0) {
        return EXIT_FAILURE;
    }

    pthread_t* thread_handles;
    thread_handles = malloc(num_threads * sizeof(pthread_t));

    int thread;
    for (thread = 0; thread < num_threads; thread++) {
        pthread_create(
                &thread_handles[thread],
                NULL,
                thread_function,
                (void *) (long) thread);
    }

    for (thread = 0; thread < num_threads; thread++) {
        pthread_join(thread_handles[thread], NULL);
    }

    printf("Total: %d\n", shared_var);

    free(thread_handles);
    return 0;
}

void *thread_function(void* thread_number) {
    while (shared_var < 10000) {

        while (current_turn != (int) thread_number);

        if (shared_var < 10000) {
            shared_var = shared_var + 1;
            printf("Thread %ld increments to %d\n",
                    (long) thread_number, shared_var);
        }

        current_turn++;
        if (current_turn >= num_threads) {
            current_turn = 0;
        }
    }

    return NULL;
}