summaryrefslogtreecommitdiff
path: root/c11/c11_mutex01/test.c
diff options
context:
space:
mode:
Diffstat (limited to 'c11/c11_mutex01/test.c')
-rw-r--r--c11/c11_mutex01/test.c85
1 files changed, 85 insertions, 0 deletions
diff --git a/c11/c11_mutex01/test.c b/c11/c11_mutex01/test.c
new file mode 100644
index 0000000..ab4622a
--- /dev/null
+++ b/c11/c11_mutex01/test.c
@@ -0,0 +1,85 @@
+/**
+ * @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 mtx_t mutex1;
+
+int Thread1_Body(void *arg)
+{
+ int rc;
+ struct timespec delay;
+
+ (void) arg;
+
+ puts("Thread1 - mtx_trylock(mutex1) -> thrd_busy");
+ rc = mtx_trylock(&mutex1);
+ assert(rc == thrd_busy);
+
+ puts("Thread1 - mtx_timedlock(mutex1, 2 second) - thrd_timeout");
+ delay.tv_sec = time(NULL) + 1;
+ delay.tv_nsec = 0;
+ rc = mtx_timedlock(&mutex1, &delay);
+ assert(rc == thrd_timedout);
+
+ puts("Thread1 - mtx_lock(mutex1)");
+ rc = mtx_lock(&mutex1);
+ assert(rc == thrd_success);
+
+ puts("Thread1 - yield" );
+ thrd_yield();
+
+ puts("Thread1 - exit" );
+ thrd_exit(0);
+ return 0;
+}
+
+int main(int argc, char **argv)
+{
+ int rc;
+ struct timespec delay = {5, 0};
+
+ puts("*** START OF C11 MUTEX EXAMPLE ***");
+
+ puts("main - Create Thread1");
+ rc = thrd_create(&thread1, Thread1_Body, &thread1);
+ assert(rc == thrd_success);
+
+ puts("main - mtx_init(mutex1)");
+ rc = mtx_init(&mutex1, mtx_timed);
+ assert(rc == thrd_success);
+
+ puts("main - mtx_lock(mutex1)");
+ rc = mtx_lock(&mutex1);
+ assert(rc == thrd_success);
+
+ puts("main - yield to Thread1" );
+ thrd_yield();
+
+ puts("main - sleep to let Thread2's delay complete while locked");
+ rc = thrd_sleep(&delay, NULL);
+ assert(rc == 0);
+
+ puts("main - mtx_unlock(mutex1)" );
+ rc = mtx_unlock(&mutex1);
+ assert(rc == thrd_success);
+
+ puts("main - yield to Thread1" );
+ thrd_yield();
+
+ puts("main - mtx_destroy(mutex1)" );
+ mtx_destroy(&mutex1);
+
+ puts("*** END OF C11 MUTEX EXAMPLE ***");
+ return 0;
+}