Date: Sun, 07 Aug 2005 11:03:24 +0200 From: Gerhard Hoffmann <gh1001@rbg.informatik.tu-darmstadt.de> To: freebsd-hackers@freebsd.org Subject: pthreads problem Message-ID: <42F5CE5C.9060602@rbg.informatik.tu-darmstadt.de>
index | next in thread | raw e-mail
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
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?42F5CE5C.9060602>
