Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Alarm. Mutex. Semaphor. Синхронизация


Автор: konshyn 18.11.2013, 09:35
Привет.
В общем, суть:
Есть главный процесс. В нем, создаются потоки, которые используют общие данные(бинарное дерево, если кому интересно).
Каждую секунду и каждые 30 секунд нужно проверять это дерево и удалять из него элементы, если нужно.
Решил сделать через alarm(). Но в чем проблема: alarm можно использовать только один в процессе.
Другими словами, на данныый момент у меня в программе три процесса: первый создает потоки, второй каждую секунду проверяет дерево, третий проверяет каждые 30 секунд дерево. Все эти три процесса могут изменять дерево.
Потоки синхронизируются мьютексами, а процессы - семафорами. 

В процессе написания темы возникла еще одна идея: создать один процесс с одним alarm() и там считать секунды (по mod 30).

И вопрос: может это все как-то можно по-другому реализовать? Если можно, то как?

Автор: bsa 18.11.2013, 10:42
konshyn, alarm ставится на ближайшее время. Когда сработает, переставляется на следующее. И так далее...

Автор: konshyn 18.11.2013, 11:01
Цитата(bsa @ 18.11.2013,  10:42)
konshyn, alarm ставится на ближайшее время. Когда сработает, переставляется на следующее. И так далее...

Я понимаю.
Иногда достаточно озвучить проблему вслух(или, как в моем случае, создать тему на форуме), чтобы найти удовлетворяющее решение.

Для интересующихся:
Просто ставлю каждый раз alarm(1).
В обработчике сигнала осуществляю только факт получения сигнала(использую флаг, в общем).
и есть отдельный поток, который стоит все время в pause(), чтобы не ело процессорное время(благо, если стоит опция SA_RESTART в sigaction(), то pause() не возобнавляется.. кто это придумал - гений:))
при получении сигнала функция pause() обрывается и уже смотрит, была это 30-ая секунда или нет, и в соответствии с результатом вызывает поиск по соответствующему полю.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)