Обработка сигналов в приложении MPI / Изящный выход
Как можно обрабатывать сигналы в безопасном и MPI-приложении (например, SIGUSR1, который должен сообщить приложению, что его время выполнения истекло и должно завершиться в течение следующих 10 минут). У меня есть несколько ограничений:
Завершите все параллельные / последовательные операции ввода-вывода перед выходом из приложения!При любых других обстоятельствах приложение может выйти без проблем.Как это может быть достигнуто безопасно, без тупиков при попытке выйти и правильно оставить текущий контекст, возвращаясь кmain()
и звонитMPI_FINALIZE()
? Каким-то образом процессы должны согласовываться при выходе (я думаю, что это то же самое в многопоточных приложениях), но как это сделать эффективно, не связываясь со многими? Кто-нибудь знает какой-то стандартный способ сделать это правильно?
Ниже приведены некоторые мысли, которые могут или не могут работать:
Идея 1:
Допустим, для каждого процесса мы перехватываем сигнал в обработчике сигналов и помещаем его в «стек необработанных сигналов» (USS), и мы просто возвращаемся из процедуры обработчика сигналов. Затем в нашем приложении есть определенные точки завершения, особенно до и после операций ввода-вывода, которые затем обрабатывают все сигналы в USS. Например, если в USS есть SIGUSR1, то каждый процесс завершается в точке завершения.
Идея 2:
Только главный процесс 0 улавливает сигнал в обработчике сигналов и затем отправляет широковещательное сообщение: «весь процесс завершен!» в конкретный момент в приложении. Все процессы получают широковещательную рассылку и бросок и исключение, которое отлавливаетсяmain
а такжеMPI_FINALIZE
называется.
Большое спасибо!