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