LINUX.ORG.RU

Больной вопрос про сигналы в тредах


0

0

Народ, помогите, я совсем запутался... :(

Проблема в следующем. Есть библиотека, реализующая интерфейс тредов. Необходимо наличие функций suspend и resume для тредов. Реализованы они у меня как посылка и обработка сигналов 35/36. Т.е. приостанавливаемый тред, получив сигнал 35, ждет в сигнальном хендлере suspend сигнала 36 (resume) в вызове sigsuspend(). Ясно, что при работе этого хенддера все сигналы кроме 36 блокируются.

Все это замечательно работает в LinuxThreads. Но мне нужно сделать переход на NPTL. Там несколько все сложнее, и в сигнальном хендлере suspend необходимо сделать кое-какую работу (сохранить контекст приостанавливаемого треда); кроме того, нужно сделать так, чтобы тред, который послал сигнал suspend, дождался остановки останавливаемого треда, чтобы убедиться, что работа в хендлере сделана, контекст сохранен. Для этого используется нотификация с помощью pthread_cond_signal из хендлера, а тот, кто посылает suspend, ждет этого события в pthread_cond_wait. В манах по этим функция написано, что так делать нельзя. Но маны вообще-то от LinuxThreads, и собсна до конца непонятно, можно ли или нет это делать в NPTL. У меня периодически, когда число тредов возрастает, начинаются сбои - данные тредов портятся. В чем дело, я не понимаю.

Вот мне и интересно - что можно и чего нельзя делать в обработчиках сигналов в случае NPTL и как вообще лучше реализовать suspend/resume.

Огромнейшее спасибо за любую помощь!

anonymous

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.