У меня есть ситуация, когда обработчик сигнала должен при определенных условиях вернуть без снятия маскировки с себя , т.е. после возврата сигнал должен оставаться заблокированным в маске сигнала потока.Прыжок из обработчика сигнала с longjmp
не будет работать, потому что мне нужно вернуться к точной точке, которая была прервана, как нормальный возврат обработчика сигнала.Есть ли какой-либо совместимый способ сделать это, кроме использования ucontext_t
, который был удален из стандартов?Я не могу изменить обработчики сигналов или расположение;все эффекты должны быть локальными для потока.
Цель этого кода связана с некоторыми атомарными операциями и возможностью возникновения состояния гонки или тупика.В основном потенциально прерванный код выглядит следующим образом:
atomic_write(&thread_local_flag, 1);
atomic_dec(&global_counter);
Если флаг установлен и счетчик уменьшен, все в порядке, и обработчику сигнала нечего делать, но сигнал может прийти между двумя инструкциями,В этом случае обработчик сигнала хочет немедленно вернуться и позволить декременту продолжить, но процесс засыпается сигналами (предназначенными для приема всеми потоками для тайной синхронизации), и есть вероятность, что он может зацикливаться вечно (или припо крайней мере, в течение неограниченного времени) обработка сигналов, в то время как другие потоки никогда не получают свои сигналы.
Если бы я мог оставить сигнал заблокированным, когда обработчик сигнала вернется, проблем не будет.