Konstantin
Интересующийся
Сообщений: 7
|
|
« : 26 Март, 2013, 17:50:08 » |
|
Проблемный проект создает нити _beginthread() где-то около 16 штук, которые при необходимости снимаются через посылку сигнала 9 (kill()). Эти нити работают с удаленными серверами через функции Send/Recieve(). Некоторое количество создания/удаления нитей где-то около 3-4 приводит к тому, что другая очень простая программа не может создать одну нить. Функция _beginthread() возвращает -1 и errno=11 - недостаточно ресурсов - попытайся позже. Причем зацикливание попыток создания нити во второй простой программе дает постоянный эффект - нити невозможно создать, пока я не убиваю родительский большой процесс, который создавал 16 нитей. Большой процесс представляет собой photon программу и создает нити с указанием только объема требуемого стека. После завершения работы этот же процесс убивает по очереди все нити через kill() и дожидается снятия потомка. ps показывает, что все нормально - зомби нет и процессов лишних тоже. Тем не менее, какой-то ресурс остается захваченным и не позволяет создать всего одну нить в другом процессе. Я предложил программисту, создавшем монстра снимать все нити через глобальный флаг terminate с возможностью штатного завершения нити с освобождением всех захваченных ими ресурсами самостоятельно в коде нити с последующим вызовом _endthread(). Но программист ссылается на то, что всегда работало с kill(). Я хотел было показать ему, что какой-то ресурс захвачен и не освобожден, но все мои попытки получить от операционки причину отказа создания нити увенчались провалом. Памяти хватает - 300Мб свободно, файловых дескрипторов кажется тоже - я собирал ядро с увеличенными объемами файлов, процессов, семафоров и т.д. - но это не помогло. Запускал монитор ядра - действительно Proc менеджер выдает ошибку 11, но больше из этого monitor получить не удалось. Далее я пробовал получить информацию непосредственно от Proc32 через traceinfo. Я собирал ядро с различными ключами -v(1..3) для Proc32 и выставлял уровень 7 для журнала. На мое удивление Proc32 кроме момента запуска программы больше ничего не сохраняет в журнале - никаких ошибок и причин отказа в создании нити там и близко нет. Системные утилиты sin и vsin ничего подозрительного не дают - там вообще все спокойно - даже gdt не меняются. Файловых дескрипторов действительно много - каждая нить кроме стандартных дескрипторов 0..2 имеет еще унаследованные от родителя дескрипторы разделяемой графической памяти с драйвером, фонты и еще что-то, но количество, как мне кажется никак не должно влиять - собирал ядро с вдвое большим допустимым объемом файлов. Загрузка процессора минимальна - нити почти всегда блокированы семафорами, приоритеты у всех процессов стандартные 10о. Подскажите, каким образом можно решить задачу с выяснением того, что мешает Proc32 создать нить? Возможно кто-то сталкивался с подобной проблемой или есть что-то еще, что мешает создать нить?
|