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

Войти
 
 
 Сайт СВД ВС  Начало   Помощь Поиск Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Поток в программе при завершении становится зомби  (Прочитано 408 раз)
Дмитрий
Пользователь

Сообщений: 46


« : 18 Августа, 2015, 16:32:36 »

Здравствуйте!

Столкнулся со следующей проблемой:

Есть поток, запускаемый в программе
Код:
char      *stack_s;
char      *args_s[3];
......
  stack_s = (char *) malloc( STACK_SIZE );
.......
функция, вызываемая, что бы запустить поток:
int play_(void)
{
if(flag==1)
{
        _beginthread( thread_s, stack_s, STACK_SIZE, args_s );
}
return 0 ;
}
void thread_s( void *parm )
  {
 
//здесь выполняется некоторый код
   flag =0;  
 _endthread();
  }
/* --------------------------------------------- */

при запуске программы, при каждом вызове функции play_, в системе появляется по одному ZOMBIE, пока основная программа не завершится!
Каждый поток выполняет свою работу и должен по-идее корректно завершиться.
Если я комментирую _beginthread, то зомби в системе конечно нет.
Что я делаю не корректно, ведь в документации сказано, что поток должен завершаться функцией _endthread ?
Получается что потоки в QNX4 создаются все же как процессы, когда должна вызываться функция wait() или waitpid()
Важная вещь: программа запускается под VirtualBox, система QNX4.2. Вывод процессов осуществляется графической функцией sin.

P.S. открыл справку в QNX, собрал пример из хелпа к _beginthread() , в системе, пока запущен основной процесс, висит зомби.

(После того, как программа проработает достаточно продолжительное время, любая попытка запуска любого приложения, в том числе консоли приводит к ошибке
"resource temporary unavailable" так процессов зомби становиться огромное количество.)
Переделал алгоритм, так, что бы в программе один поток был запущен постоянно.
« Последнее редактирование: 19 Августа, 2015, 16:13:40 от Дмитрий » Записан
Андрей Сеньков
Администратор
Опытный пользователь

Сообщений: 262



WWW
« Ответ #1 : 20 Августа, 2015, 13:59:40 »

Здравствуйте!

ZOMBIE - это состояние, когда дочерний процесс освободил ресурсы, но не может передать статус завершения в родительский процесс (если не был запущен с флагом _SPAWN_NOZOMBIE), поскольку родитель не ожидает получения этого статуса (не вызвал wait() или waitpid()). Данное замечание справедливо и для т.н. потоков 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 посещал эту страницу 16 Ноября, 2016, 07:21:16