Проблема в sighandler

#c #multithreading

#c #многопоточность

Вопрос:

Я создаю библиотеку потоков пользовательского уровня, реализующую упреждающий планировщик циклического перебора. У меня есть функция обработчика, подобная этой:

  void handler(int signum)
 {
   gtthread_yield();   
 }
  

В gtthread_yield я выполняю переключение контекста, чтобы переключиться на следующий поток, который должен быть выполнен. В большинстве случаев логика работает нормально. Но я получаю ошибку сегментации, когда сигнал подается еще до того, как функция gtthread_yield (вызываемая из sighandler) может завершить выполнение. Из-за этого мой код обращается к недопустимой ячейке памяти (памяти, которую я уже освободил)

Есть ли какой-либо способ избежать вызова обработчика до завершения выполнения функции gtthread_yield?

Спасибо

Комментарии:

1. что такое gtthread_yield? безопасен ли это асинхронный сигнал?

2. Нет, это не так. Это просто обычная функция

Ответ №1:

Используйте sigaction() и его помощники ( sigemptyset() , sigfillset() , sigaddset() , и т.д.) для блокировки сигналов во время выполнения обработчика. Вероятно, это необходимый шаг; этого может быть недостаточно. Если этого недостаточно, вам, вероятно, нужно пересмотреть обработку сигнала, чтобы он почти ничего не делал, кроме volatile sig_atomic_t переменной, перед возвратом. Затем вызывающий код должен посмотреть на атомарную переменную и вызвать gtthread_yield() , когда она установлена (не забыв очистить переменную после возврата из gtthread_yield() .

Ответ №2:

Вы можете блокировать другие сигналы на время обработки, см., Например, Эту запись в руководстве glibc, как это сделать.