Официальный форум СВД Встраиваемые Системы
03 Декабря, 2016, 18:39:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
 
 
 Сайт СВД ВС  Начало   Помощь Поиск Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблемы многократного создания и снятия нитей.  (Прочитано 914 раз)
Konstantin
Интересующийся

Сообщений: 4


« : 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 создать нить? Возможно кто-то сталкивался с подобной проблемой или есть что-то еще, что мешает создать нить?
Записан
Олег Большаков
Администратор
Житель форума

Сообщений: 2931



WWW
« Ответ #1 : 28 Марта, 2013, 12:30:42 »

К сожалению, по данному описанию проблемы без выводов диагностических утилит, сложно что-то посоветовать. Каких-то специальных средств анализа для данной ситуации не предусмотрено. При создании потока (нити) создаются копии всех ресурсов: файловых дескрипторов, имён и т.д. Идентификаторы потока используют одно пространство с идентификаторами процессов. Ошибка EAGAIN говорит о том, что какой-то ресурс исчерпан. Какой именно, Вы должны определить исходя из конфигурации своей системы.

Отдельно хотел отметить, что подход, когда создаётся один процесс (который является в том числе и графическим приложением) с несколькими потоками, которые используют механизм SRR, нехарактерен для QNX4. Зачастую применяется схема с несколькими процессами, которые взаимодействуют друг с другом через разделяемую память. Такая схема проще в отладке и сопровождении.
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP © 2002-2016 СВД Встраиваемые Системы.
При использовании материалов сайта ссылка на forum.kpda.ru обязательна.

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines | © Aiwan. Kolobok smiles | Sitemap
Valid XHTML 1.0! Valid CSS!
Сайт СВД ВС

В последний раз google посещал эту страницу 25 Октября, 2016, 23:32:52