From 836e6d3fd040c0152d7e4c17c1ef6751ca14d5f5 Mon Sep 17 00:00:00 2001 From: Julian Seward Date: Wed, 24 Apr 2002 19:23:50 +0000 Subject: [PATCH] Add a very simple test for pthread_once(). git-svn-id: svn://svn.valgrind.org/valgrind/trunk@133 --- tests/Makefile.am | 3 +- tests/pth_once.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 tests/pth_once.c diff --git a/tests/Makefile.am b/tests/Makefile.am index 0f144e7ea2..6869a2c70b 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -26,4 +26,5 @@ EXTRA_DIST = \ twoparams.s \ pth_cvsimple.c pth_simple_threads.c pth_simple_mutex.c \ bt_everything.c bt_literal.c \ - pth_threadpool.c pth_specific.c pth_mutexspeed.c malloc3.c + pth_threadpool.c pth_specific.c pth_mutexspeed.c malloc3.c \ + pth_once.c diff --git a/tests/pth_once.c b/tests/pth_once.c new file mode 100644 index 0000000000..0d795c5898 --- /dev/null +++ b/tests/pth_once.c @@ -0,0 +1,81 @@ +/******************************************************** + * An example source module to accompany... + * + * "Using POSIX Threads: Programming with Pthreads" + * by Brad nichols, Dick Buttlar, Jackie Farrell + * O'Reilly & Associates, Inc. + * + ******************************************************** + * once_exam.c + * + * An example of using the pthreads_once() call to execute an + * initialization procedure. + * + * A program spawns multiple threads and each one tries to + * execute the routine welcome() using the once call. Only + * the first thread into the once routine will actually + * execute welcome(). + * + * The program's main thread synchronizes its exit with the + * exit of the threads using the pthread_join() operation. + * +*/ + +#include +#include +#include +#include + +#include + +#define NUM_THREADS 10 + +static pthread_once_t welcome_once_block = PTHREAD_ONCE_INIT; + +void welcome(void) +{ + printf("welcome: Welcome\n"); +} + +void *identify_yourself(void *arg) +{ + int *pid=(int *)arg; + int rtn; + + if ((rtn = pthread_once(&welcome_once_block, + welcome)) != 0) { + fprintf(stderr, "pthread_once failed with %d",rtn); + pthread_exit((void *)NULL); + } + printf("identify_yourself: Hi, I'm thread # %d\n",*pid); + return(NULL); +} + +extern int +main(void) +{ + int *id_arg, thread_num, rtn; + pthread_t threads[NUM_THREADS]; + + id_arg = (int *)malloc(NUM_THREADS*sizeof(int)); + + for (thread_num = 0; thread_num < NUM_THREADS; (thread_num)++) { + + id_arg[thread_num] = thread_num; + + if (( rtn = pthread_create(&threads[thread_num], + NULL, + identify_yourself, + (void *) &(id_arg[thread_num]))) + != 0) { + fprintf(stderr, "pthread_create failed with %d",rtn); + exit(1); + } + } + + for (thread_num = 0; thread_num < NUM_THREADS; thread_num++) { + pthread_join(threads[thread_num], NULL); + printf("main: joined to thread %d\n", thread_num); + } + printf("main: Goodbye\n"); +} -- 2.47.2