Pthread Issue with uClibc (arm-openwrt-linux-uclibcgnueabi-xxx)

Nitin Garg nitingarg98 at gmail.com
Tue May 10 13:02:17 UTC 2011


What version of uclibc are you using? Did you try the 0.9.32 (rc3)? There was an issue with atomic functions for ARM, which was resolved about a month back.

Regards,
Nitin

Sent from my Motorola ATRIX™ 4G on AT&T

-----Original message-----
From: Kamaraj P <pkamaraj at gmail.com>
To: uclibc at uclibc.org
Sent: Tue, May 10, 2011 05:49:56 GMT+00:00
Subject: Pthread Issue with uClibc (arm-openwrt-linux-uclibcgnueabi-xxx)

Hello,

I have used pthread_cond_wait and pthread_cond_singnal in my sample
program for the thread synchronization.
Some how the pthread_mutex_lock blocks forever in the uClibc
environment. Here is my sample program.
The same example program works well in gLibc Environment.

The below program blocks once threadfunc2 takes the mutex(in OpenWRT
ARM uClibc environment).

Platform: ARM-OpenWRT
ToolChain: arm-openwrt-linux-uclibcgnueabi-

Is there any issue with uClibc with pthread ? Can anyone throws some
light on this.!!

Thanks in advance
-Kamaraj

pthread_cond_t      cond ; // = PTHREAD_COND_INITIALIZER;
pthread_mutex_t     mutex ; //= PTHREAD_MUTEX_INITIALIZER;
int          lock=0;

void threadfunc1(void *parm)
{
 unsigned int rc;
   printf("%s\n",__FUNCTION__);
   while (1) {
       printf("T1:pthread_mutex_lock()\n");
       rc = pthread_mutex_lock(&mutex);
       while (!lock) {
           printf("T1:Thread blocked waiting for condition \r\n");
           rc = pthread_cond_wait(&cond, &mutex);
           printf("T1:pthread_cond_wait() done rc = %d\n", rc);
       }
       printf("T1:Thread awake, finish work!\n");
       rc = pthread_mutex_unlock(&mutex);
       printf("T1:pthread_mutex_unlock() done rc = %d\n", rc);
   }
}

void threadfunc2(void *parm)
{
   unsigned int rc;

   printf("%s\n",__FUNCTION__);
   sleep(50);
   printf("T2:pthread_mutex_lock()\n");
   rc = pthread_mutex_lock(&mutex);
   printf("T2:pthread_cond_signal() rc = %d\n", rc);
   lock=1;
   rc = pthread_cond_signal(&cond);
   printf("T2:pthread_cond_signal() done rc = %d\n", rc);
   rc = pthread_mutex_unlock(&mutex);
   printf("T2:pthread_mutex_unlock() done rc = %d\n", rc);

   return;
}
int main()
{
   pthread_t tid1,tid2;
   cs_int32 rc;
   if (pthread_mutex_init(&mutex, NULL) != 0) {
    perror("pthread_mutex_init() error");
    return 0;
    }

   if (pthread_cond_init(&cond, NULL) != 0) {
     perror("pthread_cond_init() error");
     return 0;
   }

   /* Create 1st Thread */
   rc =  pthread_create(&tid1, NULL, (void *(*)(void*))threadfunc1, NULL);
   if(rc != 0) {
       printf("TID1 Fail %d\r\n",rc);
   }
   printf("TID1  %d\r\n",(cs_uint32)tid1);

   rc =  pthread_create(&tid2, NULL, (void *(*)(void*))threadfunc2, NULL);
   if(rc != 0) {
       printf("TID2 Fail %d\r\n",rc);
   }
   printf("TID2  %d\r\n",(cs_uint32)tid2);

   return 0;
}
_______________________________________________
uClibc mailing list
uClibc at uclibc.org
http://lists.busybox.net/mailman/listinfo/uclibc


More information about the uClibc mailing list