#include #include #include #include #include "linen.h" #define NUM_THREADS 10 /* Argument for thread function */ typedef struct { useconds_t delay; int id; } f_arg_t; /* Function for threads to run */ void* f(void* arg) { f_arg_t* a = (f_arg_t*)arg; usleep(a->delay); printf(" Hello from thread #%d!\n", a->id); return (void*)&(a->delay); } void main() { printf("\x1B[1mTEST 01: threads print after random delay " "while getting joined consecutively:\x1B[0m\n"); /* Thread handles and arguments */ linen_thread_t ts[NUM_THREADS]; f_arg_t args[NUM_THREADS]; /* Set arguments */ srand(time(NULL)); for (int i = 0; i < NUM_THREADS; i++) { args[i].delay = (useconds_t)rand() % 1000000; args[i].id = i; } /* Spawn threads */ for (int i = 0; i < NUM_THREADS; i++) { int r = linen_thread_create(&ts[i], f, (void*)&args[i]); if (r) { printf(" Failed to spawn thread #%d with error %d\n", i, r); } } /* Wait for each thread to finish in order, and print its argument. * The first message only prints once thread #0 is done, and so on. */ for (int i = 0; i < NUM_THREADS; i++) { useconds_t* pd; int r = linen_thread_finish(ts[i], (void**)&pd); if (r) { printf(" Failed to join thread #%d with error %d\n", i, r); } else { printf(" Thread #%d slept for %dms\n", i, *pd / 1000); } } }