Have threads wait in pthread_cond_wait()
PATCH 1/1 Have threads wait in pthread_cond_wait()
From: Sukadev Bhattiprolu <[email protected]>
Date: Wed, 9 Dec 2009 10:09:08 +0530
Subject: [PATCH] Have threads wait in pthread_cond_wait()
Rather than sleep() have the threads wait in pthread_cond_wait() for the checkpoint and ensure they are properly signalled after restart. Also add some debug messages.
Signed-off-by Sukadev Bhattiprolu <[email protected]>
--- process-tree/pthread1.c | 66 +++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 61 insertions(+), 5 deletions(-)
process-tree/pthread1.c +61 -5
@@ -5,6 +5,7 @@#include <string.h> #include <stdlib.h> #include <libcrtest.h> +#include <pthread.h> int num_threads =5 ;FILE *logfp;
@@ -17,17 +18,61 @@ static void usage(char *argv[])do_exit (1 ); } +struct test_arg { +pthread_mutex_t *mutex; +pthread_cond_t *cond; +}; +void *do_work (void *arg) { -#if 0 -fprintf (logfp,"Thread %lu sleeping...\n" ,pthread_self ()); +int rc; +struct test_arg *targ = (struct test_arg *)arg; + +fprintf (logfp,"Thread %lu: waiting...\n" ,pthread_self ());fflush (logfp); -#endif + + rc =pthread_cond_wait (targ->cond, targ->mutex); +if (rc <0 ) { +perror ("pthread_cond_wait()" ); +exit (1 ); + } +pthread_mutex_unlock (targ->mutex); + +fprintf (logfp,"Thread %lu: wokeup...\n" ,pthread_self ()); + rc =pthread_cond_signal (targ->cond); +if (rc <0 ) +fprintf (logfp,"do_work(): pthread_cond_signal() failed %s\n" , +strerror (errno)); + +fprintf (logfp,"Thread %lu: exiting...\n" ,pthread_self ()); +fflush (logfp); +} + +void * +do_work_coord (void *arg) +{ +int rc; +struct test_arg *targ = (struct test_arg *)arg; +while (!test_done ())sleep (1 ); + +fprintf (logfp,"Thread %lu: test-done\n" ,pthread_self ()); + + rc =pthread_cond_signal (targ->cond); +if (rc <0 ) +fprintf (logfp,"do_work_coord(): pthread_cond_signal() error " +"%s\n" ,strerror (errno)); + +fprintf (logfp,"Thread %lu: exiting...\n" ,pthread_self ()); +fflush (logfp); } +pthread_mutex_t mutex =PTHREAD_MUTEX_INITIALIZER ; +pthread_cond_t cond =PTHREAD_COND_INITIALIZER ; +struct test_arg targ; +pthread_t *create_threads (int n) {int i;
@@ -35,6 +80,9 @@ pthread_t *create_threads(int n)pthread_t *tid_list;pthread_t tid; + targ.mutex = &mutex; + targ.cond = &cond; + tid_list = (pthread_t *)malloc (n *sizeof (pthread_t));if (!tid_list) { fprintf(logfp, "malloc(%d) failed, error %s\n",
@@ -42,8 +90,16 @@ pthread_t *create_threads(int n)do_exit (1 ); } -for (i =0 ; i < n; i++) { - rc =pthread_create (&tid,NULL , do_work,NULL ); + rc =pthread_create (&tid,NULL , do_work_coord, &targ); +if (rc <0 ) { +fprintf (logfp,"pthread_create() of coord failed, rc %d " +"error %s\n" , rc,strerror (errno)); +do_exit (1 ); + } + tid_list[0 ] = tid; + +for (i =1 ; i < n; i++) { + rc =pthread_create (&tid,NULL , do_work, &targ);if (rc <0 ) {fprintf (logfp,"pthread_create() failed, i %d, rc %d " "error %s\n" , i, rc,strerror (errno));
Signature · 1 line
1.6.0.4