Что представляет собой асинхронную безопасность - PullRequest
14 голосов
/ 13 декабря 2011

Говорят, что вы должны вызывать только асинхронно-безопасные функции внутри обработчика сигнала.У меня вопрос, что составляет асинхронная безопасность ?Функция, которая является реентерабельной и поточно-безопасной , является асинхронно-безопасной Я полагаю?Или нет?

Ответы [ 2 ]

12 голосов
/ 13 декабря 2011

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

асинхронно-безопасная функция [GNU Pth]

Функция является асинхронно-безопасной или асинхронно-безопасной, если ее можно вызывать безопасно и безпобочные эффекты в контексте обработчика сигнала.То есть он должен иметь возможность прерываться в любой точке, чтобы работать линейно из последовательности, не вызывая противоречивого состояния.Он также должен функционировать должным образом, когда глобальные данные сами могут быть в несогласованном состоянии.Некоторые асинхронно-безопасные операции перечислены здесь:

  • вызывает функцию signal() для переустановки обработчика сигнала
  • безоговорочно изменяет переменную volatile sig_atomic_t (поскольку модификация этого типа является атомарной)
  • вызов функции _Exit() для немедленного прекращения выполнения программы
  • вызов асинхронно-безопасной функции, как определено вашей реализацией

Немногие функции переносимы асинхронно-безопасный.Если функция выполняет какие-либо другие операции, она, вероятно, не является переносимой асинхронно-безопасной.

Эмпирическое правило таково - сигнализируйте только некоторую переменную условия из обработчика сигнала (например, условие futex / pthread, пробуждениеup epoll loop и т. д.).

ОБНОВЛЕНИЕ:

Как предполагает EmployedRussian, даже вызов pthread_cond_signal - плохая идея.Я проверил исходный код недавнего eglibc и там есть пара блокировок / разблокировок.Таким образом, введение возможности для тупика.Это оставляет нам несколько вариантов для сигнализации других потоков:

  1. Использование eventfd.
  2. Изменение глобальной атомарной переменной и надежда на то, что SA_RESTART не установлен, и другиетемы проверят наши атомные.
1 голос
/ 13 декабря 2011

Для вашего собственного кода да, реентерабельность и поточнобезопасность - это характеристики, которые вам нужны, так как в зависимости от того, как вы настроили механизм обработки сигналов, ваш обработчик сигналов может сам прерваться другим сигналом.В общем, старайтесь выполнять как можно меньше работы внутри обработчика сигнала.Установка флагов для запуска специального кода в обычном потоке программы - это, вероятно, все, что вам следует делать.

Для функций в ОС, которые вы можете вызывать, проверьте man 7 signal для списка того, что безопасно вызывать.Обратите внимание, что malloc() и free() являются , а не в списке.API-интерфейсы синхронизации pthread также отсутствуют в списке, но я думаю, что некоторые из них должны быть безопасными для вызова, поэтому вы можете безопасно установить глобальный флаг в обработчике сигнала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...