Это может быть полезно. Вы можете использовать pthread_kill для пробуждения определенного потока.
sigset_t _fSigMask; // global sigmask
Мы делаем это перед созданием наших тем. Потоки наследуют свою маску от потока, который их создает. Мы используем SIGUSR1, чтобы сигнализировать наши темы. Другие сигналы доступны.
sigemptyset(&_fSigMask);
sigaddset(&_fSigMask, SIGUSR1);
sigaddset(&_fSigMask, SIGSEGV);
Тогда спать нить
int nSig;
sigwait(&fSigMask, &nSig);
Затем, чтобы разбудить нить, YourThread.
pthread_kill(YourThread, SIGUSR1);
Кстати, во время нашего тестирования сон и пробуждение наших потоков таким образом было примерно в 40 раз быстрее, чем использование условных переменных.