root/src/tests/system/libroot/posix/pthread_barrier_test.cpp
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <OS.h>

#define THREAD_COUNT 10
#define CYCLES 20

pthread_barrier_t mybarrier;

void* threadFn(void* id_ptr)
{
        int thread_id = *(int*)id_ptr;

        for (int i = 0; i < CYCLES; ++i) {
                int wait_sec = 1 + rand() % 10;
                fprintf(stderr, "thread %d: Wait %d microseconds.\n", thread_id, wait_sec * 100);
                snooze(wait_sec * 100);

                fprintf(stderr, "thread %d: Waiting on barrier...\n", thread_id);
                int status = pthread_barrier_wait(&mybarrier);
                if (status == PTHREAD_BARRIER_SERIAL_THREAD)
                        fprintf(stderr, "thread %d: serial thread.\n", thread_id);
                fprintf(stderr, "thread %d: Finished!\n", thread_id);
        }

        return NULL;
}


int main()
{
        pthread_t ids[THREAD_COUNT];
        int short_ids[THREAD_COUNT];

        srand(time(NULL));
        pthread_barrier_init(&mybarrier, NULL, THREAD_COUNT);

        for (int i = 0; i < THREAD_COUNT; i++) {
                short_ids[i] = i;
                pthread_create(&ids[i], NULL, threadFn, &short_ids[i]);
        }

        for (int i = 0; i < THREAD_COUNT; i++)
                pthread_join(ids[i], NULL);

        pthread_barrier_destroy(&mybarrier);

        return 0;
}