| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 | ||
Я понимаю. Иногда достаточно озвучить проблему вслух(или, как в моем случае, создать тему на форуме), чтобы найти удовлетворяющее решение. Для интересующихся: Просто ставлю каждый раз alarm(1). В обработчике сигнала осуществляю только факт получения сигнала(использую флаг, в общем). и есть отдельный поток, который стоит все время в pause(), чтобы не ело процессорное время(благо, если стоит опция SA_RESTART в sigaction(), то pause() не возобнавляется.. кто это придумал - гений:)) при получении сигнала функция pause() обрывается и уже смотрит, была это 30-ая секунда или нет, и в соответствии с результатом вызывает поиск по соответствующему полю. |