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

typedef struct {
    int times;
    int* target;
} threadarg_t;

void* add_number(void* argument) {
    threadarg_t* arg = argument;
    int* target = arg->target;
    int i, calculation;

    //printf("Incrementing %p, %d times\n", target, arg->times);
    for (i = 0; i < arg->times; i++) {
        calculation = *target;
        calculation++;
        pthread_yield();
        *target = calculation;

    }

    return NULL;
}

int main(int argc, char** argv) {
    if (argc <= 2) {
        printf("Usage: %s threads increments\n", argv[0]);
        return 1;
    }
    const int num_threads = atoi(argv[1]);
    const int increments = atoi(argv[2]);
    pthread_t threads[num_threads];
    int i, ret;
    int target = 0;
    threadarg_t arg = {increments, &target};

    printf("Starting %d threads, each with %d increments.\n",
            num_threads, increments);

    for (i = 0; i < num_threads; i++) {
        ret = pthread_create(&threads[i], NULL, add_number, (void*) &arg);
    }

    for (i = 0; i < num_threads; i++) {
        ret = pthread_join(threads[i], NULL);
    }

    printf("Number = %d\n", target);

    return 0;
}
