summaryrefslogtreecommitdiff
path: root/tests/test02.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test02.c')
-rw-r--r--tests/test02.c62
1 files changed, 62 insertions, 0 deletions
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 <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <unistd.h>
+
+#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);
+ }
+ }
+}