tags:

views:

69

answers:

2

I have two threads. First one is something like this:

while(1)
{
   pthread_mutex_lock(&mutex);
   //DO WORK
   pthread_mutex_unlock(&mutex);
   pthread_yield();
}

The second one locks the mutex on user event, change some settings and unlocks. Thread one does ~ 200 iterations a second. However on occasion it takes the second thread up to 3 seconds to get active (to lock the mutex). How do I ensure faster response?

EDIT- second thread:

while(1)
{
   waitForUserInput(); // blocking call to linux input
   pthread_mutex_lock(&mutex);
   // Change some settings which are used by the first thread
   pthread_mutex_unlock(&mutex);
}

EDIT2 - Fixed the question ("to unlock the mutex" -> "to lock the mutex").

+1  A: 

I'm always concerned when i see pthread_yield it is non-standard according to the man page so I generally avoid it also it really gives you no guarantees anyway, it will put you at the back of the run queue but that doesn't mean that that anything else will run depending on how the OS prioritizes your thread.

what you might want to do is explicitly hand off control to the other thread using condition variables signal and wait

luke
+1  A: 

Try changing pthread_yield() to usleep(10) or usleep(100) to determine if the yield is causing you problems, as I've seen cases where yield does nothing, which would cause your loop to unlock and relock a too quickly for the first thread to catch its lock most of the time. Then you might consider looking at condition variables in pthread if you want more control.

fsmc