Дается представление об особенностях исполнения callback-функций системных и драйверных библиотек
Описание отдельных функций системных и драйверных библиотек снабжено специальной таблицей в параграфе "Классификация":
- Да
- Многопоточность
- Нет
- Обработчик сигналов
- Нет
- Обработчик прерываний
- Нет
Таблица подобного вида раскрывает особенности исполнения в различных сценариях:
- Отдельный поток
- Для вызова обработчика порождается отдельный специализированный поток. Это может оказаться важным в случае использования TLS в обработчике.
- Многопоточность
- Обработчик может быть вызван из нескольких потоков. В некоторых случаях от обработчика ожидается обеспечение потоко-безопасности, либо учет контекста конкретного потока.
Небезопасные обработчики могут иметь внутренние ресурсы, которые с некоторой вероятностью будут повреждены при ее одновременном вызове из нескольких потоков. Также они могут иметь общий незащищенный ресурс в рамках своего класса обработчиков. В общем случае такие обработчики следует защитить от небезопасного применения, например, с использованием мьютекса. - Обработчик сигналов
- Обработчик может быть вызван внутри обработчика сигналов и должен обладать предсказуемым поведением как при вызове напрямую, так и при прерывании сигналом другой небезопасной функции.
Некоторые из таких функций при неуспешном выполнении модифицируют errno, что необходимо учитывать при написании обработчика сигналов. Для этого следует отдельно сохранять (при входе в обработчик) и восстанавливать (при выходе) errno. В противном случае, любой вызов функции, включая библиотечные, может получить асинхронно измененное значение errno, что в общем случае окажется непредсказуемым. - Обработчик прерываний
- Обработчик может быть вызван внутри обработчика прерывания (см. InterruptAttach()) и должен удовлетворять требованиям к безопасности кода.
Предыдущий раздел: Системные библиотеки