2014-11-13 4 views
0

Я создал 10 потоков (точнее, pthreads), каждый поток зарегистрирован функциями обратного вызова, скажем fn1, fn2 ... fn10. Я также назначаю различные приоритеты для каждого потока с политикой планирования FIFO. Требование приложения состоит в том, что каждую из этих функций нужно вызывать периодически (периодичность меняется для каждого потока). Чтобы реализовать периодичность, я получил идеи от других вопросов, чтобы использовать методы itimer и sigwait (не очень уверен, что это хороший способ реализовать это, любые другие предложения по реализации этого приветствуются).Периодически вызывать функции созданных потоков (ручное планирование)

Мой вопрос в том, как мне нужно обрабатывать SIGALRM для многократного вызова этих функций в соответствующих потоках, когда периодичность меняется для каждого потока?

Заранее спасибо.

ответ

2

Используя ссылку Do sleep functions sleep all threads or just the one who call it? в качестве справочного материала, я бы посоветовал избегать SIGALRM. Обычно сигналы передаются в процесс.

ИМХО у вас есть два способа сделать это:

  • реализует умный монитор, который знает о всех темах периодичности. Он вычисляет время, в которое он должен пробуждать поток, спит к тому времени, пробуждает поток и продолжает итерации по этому поводу. Pro: потоки только ждут семафора или другого мьютекса, con: монитор слишком умен для меня
  • каждый поток знает свою периодичность и сохраняет свое последнее время начала. Когда он заканчивает свою работу, он вычисляет, как долго он должен ждать до следующего времени активации и спит для этой продолжительности. Pro: каждый поток полностью независим, а реализация выглядит просто, минусы: вы должны убедиться, что в вашей реализации sleep вызывает только блоки, вызывающие поток.

Я бы воспользовался 2-м решением, потому что первый выглядит как реализация уровня пользователя sleep в многопоточной среде.

+0

Спасибо, я попробую 2-е решение и придумаю результат. – Vikram

+0

2-е решение работает достаточно хорошо. 'nanosleep' блокирует только вызывающий поток. – Vikram

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