2011-04-03 2 views
3

У меня есть ситуация, когда обработчик сигнала должен при определенных условиях возвращать без самоопределения, то есть после возвращения сигнал должен оставаться заблокированным в маске сигнала потока. Выпрыгивание из обработчика сигнала с longjmp не будет работать, потому что мне нужно вернуться к точной точке, которая была прервана, как возврат нормального сигнала. Есть ли какой-либо соответствующий способ сделать это, если не использовать ucontext_t, который был удален из стандартов? Я не могу изменить обработчики сигналов или диспозиции; все эффекты должны быть локальными для потока.Возврат из обработчика сигнала и выходного сигнала в масках

Цель этого кода связана с некоторыми атомными операциями и потенциалом для состояния гонки или взаимоблокировки. В основном потенциально прервал код выглядит следующим образом:

atomic_write(&thread_local_flag, 1); 
atomic_dec(&global_counter); 

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

Если я могу оставить сигнал заблокированным, когда обработчик сигнала вернется, проблем не возникнет.

ответ

0

Хм, лучшее, что я нашел до сих пор .. Это, кажется, работает и не зависит от каких-либо функций ucontext, только структура, которая не была удалена. В обработчик сигнала:

if (thread_local_flag) { 
    sigaddset(&((ucontext_t *)ctx)->uc_sigmask, sig); 
    return; 
} 

sig Здесь и ctx первый и третий аргумент обработчика сигнала SA_SIGINFO -типа, соответственно.

Любые мысли о том, является ли это правильным использованием или ужасным взломом (или обоими)?

Смежные вопросы