2010-03-09 4 views
2

У меня есть класс A и классы B и C. Класс B запускает один поток, а класс C работает n потоков. класс A должен запускать потоки и ждать сигнала от пользователя (скажем, Ctrl-c в Linux) - класс A остановит все потоки (классов B и C), выполнит некоторую окончательную работу, и приложение завершит работу.Вопрос по дизайну

Вопрос в том, как класс должен спать до получения сигнала? Какова наилучшая реализация?

ответ

2

Звучит как работа для переменной условия. Там в учебник о том, как использовать Pthreads переменные условия here и еще один на википедии here

Основной approcah является то, что все нити, которые вы хотите периодически убивать называют pthread_cond_timedwait, чтобы проверить, если сигнал был отправлен из класса А.

в псевдокоде каждого из потоков в классах B и C будет выглядеть примерно так

while (!pthread_cond_timedwait(/*some args (including a timeout)*/) { 
    doSomeSmallUnitOfWork; 
} 

затем в обработчике КЛАССА а, что ловит CTRL-C (или любой другой сигнал)

pthread_cont_signal(/*some more args*/); 
+0

Непонятно из ответа, как класс А должен спать до получения сигнала. BTW, pthread_cond_signal() не является сигнальной функцией, которая будет использоваться в обработчике сигналов. – Corwin

0

Проведите некоторое исследование по замкам спина. Это довольно простой вопрос параллелизма.

Также немного широк, не зная, что делают другие потоки.

+0

Из вопроса «класс C работает n потоков». Этот бит отключит меня, используя спиновые блокировки, если ОП не укажет значение для n. Если n - большое число, то спин-блокировки могут в конечном итоге бороться довольно много. Это имеет очень плохие последствия для производительности, так как все потоки будут потреблять циклы процессора во время вращения и могут голодать поток, который пытается выполнить определенную работу. Использование какой-то адаптивной блокировки спина с откидным механизмом смягчило бы это, но они не всегда реализованы для каждой платформы. – Glen

1

Возможно, вы захотите проверить sigwait. Этот метод принимает набор сигналов и ожидает появления сигналов.

Смежные вопросы