Я знаю, что это может быть немного поздно для вечеринки, и у меня нет информации о различиях в производительности, но это может быть жизнеспособной альтернативой для использования комбинации pthread_kill и sigwait, например так:
При необходимости укажите следующее:
int sigin;
sigset_t sigset;
инициализировать предыдущие переменные следующим образом:
sigemptyset(&sigset);
sigaddset(&sigset, SIGUSR1);
pthread_sigmask(SIG_BLOCK, &sigset, null);
в ветке ожидания, позвоните sigwait:
sigwait(&sigset, &sigin);
Затем в потоке, который должен пробудить ожидающий поток, вы можете сделать следующее:
pthread_kill(p_handle, SIGUSR1);
где p_handle - дескриптор потока, который вы хотите разблокировать.
В этом примере блокируется ожидающий поток, пока не будет доставлен SIGUSR1. Сигнал достигает только этого определенного потока из-за использования pthread_kill.