Why sleep() after acquiring a pthread_mutex_lock will block the whole program? Why sleep() after acquiring a pthread_mutex_lock will block the whole program? unix unix

Why sleep() after acquiring a pthread_mutex_lock will block the whole program?


This is a wrong way to use mutexes. A thread should not hold a mutex for more time than it does not own it, particularly not if it sleeps while holding the mutex. There is no FIFO guarantee for locking a mutex (for efficiency reasons).

More specifically, if thread 1 unlocks the mutex while thread 2 is waiting for it, it makes thread 2 runnable but this does not force the scheduler to preempt thread 1 or make thread 2 run immediately. Most likely, it will not because thread 1 has recently slept. When thread 1 subsequently reaches the pthread_mutex_lock() call, it will generally be allowed to lock the mutex immediately, even though there is a thread waiting (and the implementation can know it). When thread 2 wakes up after that, it will find the mutex already locked and go back to sleep.

The best solution is not to hold a mutex for that long. If that is not possible, consider moving the lock-needing operations to a single thread (removing the need for the lock) or waking up the correct thread using condition variables.


There's neither a problem, nor a bug in your code, but a combination of buffering and scheduling effects. Add an fflush here:

 fprintf (fd, "[%d]pthread_mutex_unlock is finisheded.\n", *idx); fflush (fd);

and run

./a.out >1 1.log 2> 2.log &

and you'll see rather equal progress made by the two threads.

EDIT: and like @jilles above said, a mutex is supposed to be a short wait lock, as opposed to long waits like condition variable wait, waiting for I/O or sleeping. That's why a mutex is not a cancellation point too.