diff options
Diffstat (limited to 'c11/c11_cndvar01/test.c')
-rw-r--r-- | c11/c11_cndvar01/test.c | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/c11/c11_cndvar01/test.c b/c11/c11_cndvar01/test.c new file mode 100644 index 0000000..451c7c2 --- /dev/null +++ b/c11/c11_cndvar01/test.c @@ -0,0 +1,141 @@ +/** + * @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 buffer_mutex; +static cnd_t buffer_cnd; +static int buffer_value; + +static int buffer_init(void) +{ + int rc; + + puts("buffer - mtx_init()"); + rc = mtx_init(&buffer_mutex, mtx_timed); + assert(rc == thrd_success); + + puts("buffer - cnd_init()"); + rc = cnd_init(&buffer_cnd); + assert(rc == thrd_success); + + buffer_value = -1; +} + +void buffer_destroy(void) +{ + puts("buffer - mtx_destroy()" ); + mtx_destroy(&buffer_mutex); + + puts("buffer - cnd_destroy()" ); + cnd_destroy(&buffer_cnd); +} + +static int buffer_get(void) +{ + int rc; + int value; + + // puts("buffer - mtx_lock()"); + rc = mtx_lock(&buffer_mutex); + assert(rc == thrd_success); + + while (buffer_value == -1) { + // puts("buffer - cnd_wait()"); + rc = cnd_wait(&buffer_cnd, &buffer_mutex); + assert(rc = thrd_success); + } + + value = buffer_value; + buffer_value = -1; + // puts("buffer - return value"); + + + // puts("buffer - mtx_unlock()"); + rc = mtx_unlock(&buffer_mutex); + assert(rc == thrd_success); + + return value; +} + +static void buffer_put(int value) +{ + int rc; + int old_value; + + // puts("buffer - mtx_lock()"); + rc = mtx_lock(&buffer_mutex); + assert(rc == thrd_success); + + old_value = buffer_value; + buffer_value = value; + + if (old_value == -1) { + // puts("buffer - cnd_signal()"); + rc = cnd_signal(&buffer_cnd); + assert(rc = thrd_success); + } + + // puts("buffer - mtx_unlock()"); + rc = mtx_unlock(&buffer_mutex); + assert(rc == thrd_success); + +} + +int Thread1_Body(void *arg) +{ + int rc; + int value; + + (void) arg; + + puts("Thread1 - Loop for values"); + while (1) { + value = buffer_get(); + printf("Thread1 value = %d\n", value); + } + + return 0; +} + +int main(int argc, char **argv) +{ + int rc; + int value; + struct timespec delay = {1, 0}; + + puts("*** START OF C11 CONDITION VARIABLE EXAMPLE ***"); + + puts("main - Create Thread1"); + rc = thrd_create(&thread1, Thread1_Body, &thread1); + assert(rc == thrd_success); + + buffer_init(); + + puts("main - yield to Thread1" ); + thrd_yield(); + + for (value=1 ; value <= 3 ; value++) { + printf("main - put value = %d\n", value * 10); + buffer_put(value * 10); + + puts("main - sleep to let Thread1 get the value"); + rc = thrd_sleep(&delay, NULL); + assert(rc == 0); + } + + buffer_destroy(); + + puts("*** END OF C11 CONDITION VARIABLE EXAMPLE ***"); + return 0; +} |