You can use pthread_mutex_trylock
. If that succeeds, the mutex was unclaimed and you now own it (so you should release it and return “unheld”, in your case). Otherwise, someone is holding it.
I have to stress though that “check to see if a mutex is unclaimed” is a very bad idea. There are inherent race conditions in this kind of thinking. If such a function tells you at time t
that the lock is unheld, that says absolutely nothing about whether or not some other thread acquired the lock at t+1
.
In case this is better illustrated with a code example, consider:
bool held = is_lock_held();
if (!held)
{
// What exactly can you conclude here? Pretty much nothing.
// It was unheld at some point in the past but it might be held
// by the time you got to this point, or by the time you do your
// next instruction...
}