From 1a2e93c752a6b835423cd8bee609b8ec6c3f1262 Mon Sep 17 00:00:00 2001 From: Prefetch Date: Sun, 16 Jul 2023 15:04:44 +0200 Subject: Initial commit for publication --- tests/test02.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 tests/test02.c (limited to 'tests/test02.c') diff --git a/tests/test02.c b/tests/test02.c new file mode 100644 index 0000000..1cd0c1a --- /dev/null +++ b/tests/test02.c @@ -0,0 +1,62 @@ +#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 02: 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); + } + } +} -- cgit v1.2.3