Страниц: [1]
  Печать  
Автор Тема: чтение из сом порта в потоке  (Прочитано 3060 раз)
Max_Fly
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« : Июля 30, 2004, 12:56:40 pm »

мой вопрос глупен - потому как програмист я не очень - но заранее спасибо за любой ответ. никак не могу понять -
unsigned char RxByte (int fildes, void* buf,size_t                      nbyte,const uint64_t * ntime)
{
   struct   sigevent   event;
   int   rval;
   pthread_t      thread_id;
   
   struct param      read_param;

   SIGEV_UNBLOCK_INIT(&event);
   
   read_param.fildes=fildes;
   read_param.buf=buf;
   read_param.nbyte=nbyte;

   pthread_create (&thread_id, NULL, read_thread,(void*)(&read_param));

   TimerTimeout (CLOCK_REALTIME, _NTO_TIMEOUT_JOIN, &event, ntime, NULL);
   rval = pthread_join (thread_id,NULL);
   if(rval == ETIMEDOUT)
   {
      return SLAVE_NOT_RESPONSE;
   }
   return OK;
}
в основном потоке стою и жду пока результат не будет ОК. однако колличество моих потоков по pidin постоянно увеличивается. что я делаю неправильно? ведь поток должен уничтожаться когда завершает работу функция запущенная в потоке - или нет?
Записан
Thomas
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #1 : Июля 30, 2004, 01:51:01 pm »

Увеличение числа потоков, видимо, каким-то образом связано с постоянным вызовом функции RxByte... Хотелось бы взглянуть на остальную часть кода!

А поток должен уничтожаться только после вызова pthread_exit():
http://www.qnx.com/developers/docs/momentics621_docs/neutrino/lib_ref/p/pthread_exit.html
Записан
Max_Fly
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #2 : Июля 30, 2004, 02:08:19 pm »

да конечно - сообщение состоит допустим из 20-и байт - 20 раз вызывается эта функция.
я подумал что наверное у меня таки косые руки и решил сделать так:
        if(rval == ETIMEDOUT)
   {
      pthread_cancel(thread_id);
      return SLAVE_NOT_RESPONSE;
   }
   return OK;
поток спровоцированный переходит в стостояние dead и радостно в нём так и висит. как заставить его высвободить ресурсы? ща пойду читать мануалы - слухами земля полнится что есть ещё  pthread_detach. может поможет. спасибо за отклик!
Записан
Max_Fly
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #3 : Июля 30, 2004, 02:20:30 pm »

unsigned char RxByte (int fildes, void* buf,size_t nbyte,const uint64_t * ntime)
{
   struct   sigevent   event;
   int   rval;
   pthread_t      thread_id;
   
   struct param      read_param;

   SIGEV_UNBLOCK_INIT(&event);
   
   read_param.fildes=fildes;
   read_param.buf=buf;
   read_param.nbyte=nbyte;

   pthread_create (&thread_id, NULL, read_thread,(void*)(&read_param));

   TimerTimeout (CLOCK_REALTIME, _NTO_TIMEOUT_JOIN, &event, ntime, NULL);
   rval = pthread_join (thread_id,NULL);
   if(rval == ETIMEDOUT)
   {
      pthread_cancel(thread_id);
      pthread_detach(thread_id);
      return SLAVE_NOT_RESPONSE;
   }
   return OK;
}
вот это наконец заработало как хочу. спасибо!!!
P.S. моззилла firebird thunderbird, кстати, плодят dead потоки на ура - у меня пол списка pidin ними забито ...
интересно - если не будет хватать места - система будет "чистить"?
Записан
Страниц: [1]
  Печать  
 
Перейти в: