summaryrefslogtreecommitdiff
path: root/c11/c11_thread01/test.c
diff options
context:
space:
mode:
Diffstat (limited to 'c11/c11_thread01/test.c')
-rw-r--r--c11/c11_thread01/test.c103
1 files changed, 103 insertions, 0 deletions
diff --git a/c11/c11_thread01/test.c b/c11/c11_thread01/test.c
new file mode 100644
index 0000000..831bcc7
--- /dev/null
+++ b/c11/c11_thread01/test.c
@@ -0,0 +1,103 @@
+/**
+ * @brief C11 Threads Example
+ */
+
+/*
+ * This file's license is 2-clause BSD as in this distribution's
+ * LICENSE.2 file.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <threads.h>
+#include <assert.h>
+
+static thrd_t thread1;
+static thrd_t thread2;
+
+void initialize_subsystem_once(void)
+{
+ printf("*** Subsystem initialization should only happen once\n");
+}
+void initialize_subsystem(void)
+{
+ static once_flag initialize_subsystem_only_once= ONCE_FLAG_INIT;
+
+ call_once(&initialize_subsystem_only_once, initialize_subsystem_once);
+}
+int Thread1_Body(void *arg)
+{
+ thrd_t *t = (thrd_t *) arg;
+ int rc;
+ int result;
+
+ initialize_subsystem();
+
+ printf("Thread1(0x%08lx)\n", *t);
+ assert(thrd_current() == thread1);
+
+ puts("Thread1 - yield" );
+ thrd_yield();
+
+ puts("Thread1 - join Thread2" );
+ rc = thrd_join(thread2, &result);
+ assert(rc == thrd_success);
+ printf("Thread1 - thread1 exited with %d\n", result);
+
+ puts("Thread1 - exit" );
+ thrd_exit(0);
+ return 0;
+}
+
+int Thread2_Body(void *arg)
+{
+ thrd_t *t = (thrd_t *) arg;
+
+ initialize_subsystem();
+
+ printf("Thread2(0x%08lx)\n", *t);
+ assert(thrd_current() == thread2);
+
+ puts("Thread2 - exit" );
+ thrd_exit(128);
+ return 0;
+}
+
+int main(int argc, char **argv)
+{
+ int rc;
+ struct timespec delay = {1, 0};
+
+ puts("*** START OF C11 THREAD EXAMPLE ***");
+
+ initialize_subsystem();
+
+ puts("main - Create Thread1");
+ rc = thrd_create(&thread1, Thread1_Body, &thread1);
+ assert(rc == thrd_success);
+
+ puts("main - Detach Thread1");
+ rc = thrd_detach(thread1);
+ assert(rc == thrd_success);
+
+ puts("main - yield to Thread1" );
+ thrd_yield();
+
+ puts("main - Create Thread2");
+ rc = thrd_create(&thread2, Thread2_Body, &thread2);
+ assert(rc == thrd_success);
+
+ puts("Exercise thrd_equal");
+ rc = thrd_equal(thread1, thread2);
+ assert(rc == 0);
+
+ rc = thrd_equal(thread1, thread1);
+ assert(rc != 0);
+
+ puts("main - sleep and let Thread2 run");
+ rc = thrd_sleep(&delay, NULL);
+ assert(rc == 0);
+
+ puts("*** END OF C11 THREAD EXAMPLE ***");
+ return 0;
+}