Skip to content
Snippets Groups Projects
prog.c 1.08 KiB
Newer Older
iliya's avatar
iliya committed
#include <pthread.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>

#define NB_THREADS 2
#define MAX_INCREMENT 10000

int lock;
int counter;

void init_lock(int *lock_ptr) { __sync_val_compare_and_swap(lock_ptr, 0, 0); }

void acquire_lock(int *lock_ptr) {
    __sync_val_compare_and_swap(lock_ptr, *lock_ptr, 1);
}

void release_lock(int *lock_ptr) {
    __sync_val_compare_and_swap(lock_ptr, *lock_ptr, 0);
}

void *routine(void *arg) {
    int *counter = (int *)arg;
    acquire_lock(&lock);
    for (int i = 0; i < MAX_INCREMENT; i++) {
        (*counter)++;
    }
    release_lock(&lock);

    return NULL;
}

int main(void) {
    pthread_t threads[NB_THREADS];

    init_lock(&lock);

    for (int i = 0; i < NB_THREADS; i++) {
        if (pthread_create(&threads[i], NULL, routine, &counter) == -1) {
            perror("pthread_create");
        }
    }

    for (int i = 0; i < NB_THREADS; i++) {
        if (pthread_join(threads[i], NULL)) {
            perror("pthread_join");
        }
    }

    fprintf(stdout, "Value of counter = %d\n", counter);

    return EXIT_SUCCESS;
}