У меня есть два разных приложения, которые должны работать вместе. процесс 1 действует как источник времени, а процесс 2 выполняет действия в соответствии с источником времени, предоставленным процессом 1. Мне нужно запустить несколько копий процесса 2. Цель состоит в том, чтобы один процесс источника времени сигнализировал 5-10 другим процессам в то же время поэтому они все выполняют свою работу одновременно.Использование одного процесса для сигнализации нескольких других процессов «одновременно»
В настоящее время, я это реализуется следующим образом:
- Время начала исходной программы, создал разделяемый сегмент памяти, создает пустой список PIDs, затем разблокирует сегмент.
- Каждый раз, когда запускается одна из клиентских программ, они идут в общую память, добавляют свой собственный pid в список и затем разблокируют.
- Источник времени имеет таймер, чем выключается каждые 10 мс. Каждый раз, когда таймер отключается, он циклически просматривает список pid и посылает сигнал всем, кто находится в нем, назад.
Этот подход в основном работает хорошо, но я надеюсь, что его можно улучшить. В настоящее время у меня есть две точки прилипания:
- Очень редко сигнал, передаваемый на один из клиентских процессов, будет искажен на ~ 2 миллисекунды или около того. Конечный результат: | 12ms | 8ms | вместо | 10ms | 10ms |.
- Вторая проблема заключается в том, что все клиентские программы на самом деле многопоточны и выполняют большую работу (хотя для обработки сигнала отвечает только исходный поток). Если у меня сразу работает несколько клиентских процессов, доставка сигналов становится более споратичной и перекошенной, как если бы их было сложнее поставить, когда система более облагается налогом (даже если клиентский процесс готов и ждет прерывания).
Какие еще подходы следует учитывать при выполнении этого типа вещей? Я рассмотрел следующее (все в сегменте разделяемой памяти):
- Использование volatile uin8_t флаги (заданы процессом источника времени, очищенным клиентом).
- Использование семафоров, но если процесс источника времени запущен и клиент еще не запущен, как я могу продолжать увеличивать семафор снова и снова?
- Переменные условий, хотя, похоже, не существует решения, которое может использоваться в общей памяти между несвязанными процессами.
Что касается вашей последней опции (переменные условия в SHM): http://stackoverflow.com/q/2782883/694576 – alk
Вы можете попробовать поместить все процессы в одну группу процессов и отправить сигнал группе. –
Я думаю, вы сбиваете с толку время, необходимое для того, чтобы процесс был готов к запуску со временем, чтобы фактически выполнить процесс, когда он готов к запуску. Вы можете легко использовать futex, чтобы любое количество процессов было готово к запуску в один и тот же момент. Переменные состояния в общей памяти тоже будут работать. –