Вы можете установить обработчик сигнала, скажем, для SIGUSR1, для потока, который затем будет блокировать, из другого потока вы вызываете pthread_cancel(tid)
и pthread_kill(tid, SIGUSR1)
.Поток будет отменен, как только sem_wait()
будет прерван сигналом.