includedlibrary
@includedlibrary

Насколько хорошим решением является использование pthread_kill для возобновления работы потоков?

Есть несколько потоков, которые создаются в начале работы программы и сразу же переводяться в режим ожидания. В любой момент времени можно передать данные этим потокам и вывести их из спящего режима, при этом основная программа должна ожидать завершения работы всех потоков. Когда поток завершил работу, он должен сообщить об этом основной программе и погрузиться в режим ожидания. Насколько хорошим решением является использование сигналов для выведения потоков из спящего режима, и стоит ли для этого использовать условные переменные(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-х потоков
}
  • Вопрос задан
  • 120 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Насколько хорошим решением является использование сигналов для выведения потоков из спящего режима, и стоит ли для этого использовать ...

Является решением, но не самым традиционным. Насколько хорошим -- зависит от модели совместной работы потоков/того как разделяются данные между ними. Не хватает контекста для ответа.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы