From owner-freebsd-hackers@FreeBSD.ORG Sun Aug 7 09:04:04 2005 Return-Path: X-Original-To: freebsd-hackers@freebsd.org Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 0CA5C16A467 for ; Sun, 7 Aug 2005 09:04:03 +0000 (GMT) (envelope-from gh1001@rbg.informatik.tu-darmstadt.de) Received: from ultra02.rbg.informatik.tu-darmstadt.de (ultra02.rbg.informatik.tu-darmstadt.de [130.83.160.82]) by mx1.FreeBSD.org (Postfix) with ESMTP id 8E61844041 for ; Sun, 7 Aug 2005 09:03:25 +0000 (GMT) (envelope-from gh1001@rbg.informatik.tu-darmstadt.de) Received: from [130.83.160.104] (ultra14.rbg.informatik.tu-darmstadt.de [130.83.160.104]) by ultra02.rbg.informatik.tu-darmstadt.de (8.11.7p1+Sun/8.11.6) with ESMTP id j7793ON02606 for ; Sun, 7 Aug 2005 11:03:24 +0200 (MEST) Message-ID: <42F5CE5C.9060602@rbg.informatik.tu-darmstadt.de> Date: Sun, 07 Aug 2005 11:03:24 +0200 From: Gerhard Hoffmann User-Agent: Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.7.11) Gecko/20050731 X-Accept-Language: en-us, en MIME-Version: 1.0 To: freebsd-hackers@freebsd.org Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: pthreads problem X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 07 Aug 2005 09:04:04 -0000 Hi Phil, I think the easiest solution for your problem is something like this: #include #include 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