Hi Phil,

I think the easiest solution for your problem is something like this:

#include <stdio.h>
#include <pthread.h>

volatile unsigned long len   = 0;
pthread_mutex_t lock       = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t  cond       = PTHREAD_COND_INITIALIZER;

static void cleanup_handler(void *arg) {
 (void)pthread_mutex_unlock(&lock);
 (void)pthread_mutex_destroy(&lock);
 (void)pthread_cond_destroy(&cond);
}

static void *thread_routine(void *args) {

       pthread_cleanup_push(cleanup_handler,(void*)NULL);

       while (1) {
pthread_mutex_lock(&lock);

               while(len == 0)
                       pthread_cond_wait(&cond, &lock);
fprintf(stderr,"consumer: %lu\n", --len);

               pthread_cond_signal(&cond);
               pthread_mutex_unlock(&lock);
      }
pthread_cleanup_pop(0);

      return NULL;
}

int main(int argc, char **argv) {

       pthread_t t;
       int i;

       pthread_create(&t, NULL, &thread_routine, NULL);

       for (i = 0; i < 100; i++) {
pthread_mutex_lock(&lock); while(len > 5)
                       pthread_cond_wait(&cond, &lock);
fprintf(stderr,"producer: %lu\n", ++len); pthread_cond_signal(&cond);
               pthread_mutex_unlock(&lock);
       }

pthread_cancel(t); pthread_join(t, NULL);

       return 0;
}


Gerhard


_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to