Есть несколько потоков, которые создаются в начале работы программы и сразу же переводяться в режим ожидания. В любой момент времени можно передать данные этим потокам и вывести их из спящего режима, при этом основная программа должна ожидать завершения работы всех потоков. Когда поток завершил работу, он должен сообщить об этом основной программе и погрузиться в режим ожидания. Насколько хорошим решением является использование сигналов для выведения потоков из спящего режима, и стоит ли для этого использовать условные переменные(condition variables)?
Поясняющий код:
void* worker(void *arg) {
struct sigset_t *sig = arg;
int sig_num;
for(;;) {
// Ожидание SIGUSR1
sigwait(sig, &sig_num);
// Выполнение работы
// Сигнализируем о выполненной работе
}
return NULL;
}
int main() {
struct sigset_t sig;
sigemptyset(&sig);
sigaddset(&sig, SIGUSR1);
pthread_sigmask(SIG_BLOCK, &sig, NULL);
// Создаём 4 потока
pthread_t threads[4];
for(int i = 0; i < 4; i++) {
pthread_create(&threads[i], NULL, worker, &sig);
}
// Некоторый код
// Некоторый код
// Некоторый код
// Передаём данные через глобальные переменные 4-м потокам
// Выводим 4-е потока из спящего режима
for(int i = 0; i < 4; i++) {
pthread_kill(threads[i], SIGUSR1);
}
// Ожидаем выполнения 4-х потоков
}