Обычно сигнализация может выполняться с использованием условий pthread, с использованием мьютекса для синхронизации, например:
Создание переменных мьютекса и условий:
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond, NULL);
Поток 1: ожидание сигнала:
pthread_cond_wait(&cond, &mutex);
Поток 2: сигнализировать потоку, ожидающему условие:
pthread_mutex_lock(&mutex);
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);