Основная проблема с сигналами заключается в том, что обработчики сигналов регистрируются для каждого процесса / пространства памяти (в vxWorks ядро представляет одно пространство памяти, а каждый RTP - это отдельное пространство памяти).
Это означает, что независимо от контекста потока / задачи будет выполняться один и тот же обработчик сигнала (для данного процесса). Это может вызвать некоторые проблемы с побочными эффектами, если ваш обработчик сигнала не ведет себя хорошо.
Например, если ваш сигнал использует мьютекс для защиты общего ресурса, это может вызвать неприятные проблемы или, по крайней мере, непредвиденное поведение
Task A Task B Signal Handler
Take Mutex
...
Gets preempted
does something
....
<SIGNAL ARRIVES>----->Take Mutex (blocks)
resumes
....
Give Mutex
----->Resumes Handler
Я не уверен, что приведенный выше пример действительно передает то, что я пытаюсь.
Вот некоторые другие характеристики сигналов:
- Обработчик не выполняется, пока не запланировано задание / процесс. То, что вы отправили сигнал, не означает, что обработчик будет выполнен сразу же
- Нет гарантии, по какой Задаче / Потоку будет выполняться обработчик. Любой поток / задача в процессе может запустить его (какой поток / задача выполняется первым). У VxWorks есть способы обойти это.
Обратите внимание, что вышесказанное относится только к асинхронным сигналам, отправляемым через вызов kill.
Исключение сгенерирует синхронный сигнал, который будет выполнен сразу же в текущем контексте.