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

#define THREAD_COUNT 4

int values[THREAD_COUNT];
int neighbor_sums[THREAD_COUNT];
pthread_barrier_t phase_barrier;

void *work(void *argument) {
    long id = *(long *)argument;
    values[id] = (int)id + 1;

    pthread_barrier_wait(&phase_barrier);

    int neighbor = ((int)id + 1) % THREAD_COUNT;
    neighbor_sums[id] = values[id] + values[neighbor];
    return NULL;
}

int main(void) {
    pthread_t workers[THREAD_COUNT];
    long ids[THREAD_COUNT];
    pthread_barrier_init(&phase_barrier, NULL, THREAD_COUNT);
    for (long t = 0; t < THREAD_COUNT; t++) {
        ids[t] = t;
        pthread_create(&workers[t], NULL, work, &ids[t]);
    }
    for (int t = 0; t < THREAD_COUNT; t++) {
        pthread_join(workers[t], NULL);
    }
    pthread_barrier_destroy(&phase_barrier);

    printf("Worker  Value  Neighbor sum\n");
    for (int t = 0; t < THREAD_COUNT; t++) {
        printf("%6d %6d %13d\n", t, values[t], neighbor_sums[t]);
    }
    return 0;
}
