From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 19045 invoked by alias); 8 Dec 2003 07:59:37 -0000 Mailing-List: contact pthreads-win32-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: pthreads-win32-owner@sources.redhat.com Received: (qmail 19038 invoked from network); 8 Dec 2003 07:59:36 -0000 Received: from unknown (HELO web60701.mail.yahoo.com) (216.109.117.224) by sources.redhat.com with SMTP; 8 Dec 2003 07:59:36 -0000 Message-ID: <20031208075936.76670.qmail@web60701.mail.yahoo.com> Received: from [61.11.17.69] by web60701.mail.yahoo.com via HTTP; Sun, 07 Dec 2003 23:59:36 PST Date: Mon, 08 Dec 2003 07:59:00 -0000 From: Shantanu Gogate Subject: help: weird behaviour of sem_getvalue To: pthreads-win32@sources.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-SW-Source: 2003/txt/msg00143.txt.bz2 Hi, I am using pthreads-win32 package( was using pthreads-win32-2003-05-10.exe and also tried the latest 2003-09-18.exe) but facing a weird problem using sem_getvalue. I have replicated what I am trying to do thru this snippet of code which you can test for yourself. Basically there is a semaphore which is set to one before the threads are launched. one or more threads continuously check the value of this semaphore to see if it has become zero and if it has, then the thread exits. Interestingly if you comment out the pthread_exit line then you that the sem_getvalue returns the value of semaphore as zero for a brief period of time and then starts reporting it as one again !! if i compile the same code on a linux box this anomaly is not observed. Is this is a bug in win32-pthreads ? Any help would be appreciated. Shantanu Gogate. the code: <<<< #include #include #include static sem_t g_sem_ready,g_sem_queue; void *consumer(void *args) { int count=0,value; while(1) { sem_getvalue(&g_sem_ready,&value); printf("consumer ready= %d\n",value); if(value <= 0 ) { sem_getvalue(&g_sem_queue,&value); // printf("consumer exiting, with %d pending\n"); pthread_exit(0); } else { sem_wait(&g_sem_queue); count++; // printf("consumed %d\n",count); } } } void *producer(void *args) { int value,count=0; while(1) { sem_getvalue(&g_sem_ready,&value); printf("producer ready= %d\n",value); if(value <= 0 ) { printf("producer exiting\n"); // pthread_exit(0); } else { count++; // printf("produced %d\n",count); sem_post(&g_sem_queue); if(count > 200) pthread_exit(0); } } } int main(int argc, char *argv[]) { pthread_t th1, th2; int status; sem_init(&g_sem_ready,0,0); sem_init(&g_sem_queue,0,0); sem_post(&g_sem_ready); pthread_create(&th1,NULL, consumer, NULL); pthread_create(&th2,NULL, producer, NULL); sleep(10); printf("going down baby\n"); sem_wait(&g_sem_ready); pthread_join(th2,(void **)&status); pthread_join(th1,(void **)&status); } >>>> __________________________________ Do you Yahoo!? Protect your identity with Yahoo! Mail AddressGuard http://antispam.yahoo.com/whatsnewfree