Mahmoud_Gamal Ответов: 1

Как перейти на зомби-поток в C++


с Новым годом для каждого тела :)
я сожалею, что опубликовал этот вопрос в этот день, но мне нужно его решить
я разрабатываю службу unix с использованием c++ , и проблема заключается в том, что поток A1 в ней начинается с родительского потока A, а A1 запускает другой поток B1, затем A1 завершается и B1 обрабатывает запрос, если я открываю много сеансовых потоков, которые подключаются к тесту
pid =   fork();
    while(true)
    {

            s = accept(Socket,(struct sockaddr*)&client,&len);

            if( s >-1)
                {


                printf("\n other client port %i\n",client.sin_port);

                printf("\n client connected address %s \n",inet_ntoa(client.sin_addr));


                re = new HandleResponse(); // this thread in create state not running 

                              //  r is  CircularResponse();


                re->set_Client(s);

                        re->set_manager(share_manager);


                              r->addClient(re); // add here 

                               r->start(); // and start it parent 

                     printf("\n process accept \n");

                }
            else
            {
                printf("\n wait error connecting \n");
            }


    }


а CircularResponse () - это
void CircularResponse::addClient(HandleResponse *r)
{
   qclient->push_back(r);
}
void *CircularResponse::run()
{
    HandleResponse *current;
//  HandleResponse * del;
    int h = 1;
    printf("handle Response Thread");
//    pid_t pid = fork();
printf("\n Circular response \n");

  while(true)
  {
      if(!qclient->empty())
       {
              current = qclient->front();




                        h = current->check_connect();
        printf(" current->check_connect() %i \n",h);
  printf(" thread %lu \n",current->self());
          if(h==-1)
          {


               printf("\n here I kill thread %lu \n",current->self());
               qclient->erase(std::remove(qclient->begin(),qclient->end(),current));
                delete current;
               // free(current);

                 if(qclient->size()==0)
                 {
                 printf("qclient is empty %i",qclient->size());
               //break;
              }
          }

            current->start();
             // qclient->push_back(current);
               //      current->join();
                 //    printf("join");




       printf("\n client connected %i \n",(int)qclient->size());
        qclient->pop_front();
   }
   sleep(3);
  }
  printf("\n LTSC_Manager Finsh Job  \n");
  return NULL;


и обрабатывать ответ
int HandleResponse::ProcessResponse()
{
     int h =0;
     printf("\n Read thread %lu \n",this->m_tid);
     string Technology = "",Exchange = "",Switch = "" ;

            h = read(Socket,&bbuf,sizeof(bbuf));

            if(h == 0 )
            {

                printf("\n  other Client Close \n");
                close(Socket);
                Socket = -1;
                pthread_cancel(this->m_tid);
                printf("\n done \n");
                return -1;

            }


            IDriver * driver = NULL ;

            CComponentsKernel* g = new CComponentsKernel();

            IComponent* comp = g->CreateComponent("TL1 Parser");

            vector<CParserOutNode> m_Param;

            char *TestType = NULL;

            map<string,string> m_Tl1ParamsMap;

            if(comp)
....
....



таким образом проблема иногда в том что последние два потока переходят в зомби состояние является ли этот шаблон проектирования истинным или нет или есть ошибка в дизайне подсказка это все наследуют форму класса pthread

Pablo Aliskevicius

Взгляните на это:
http://programmers.stackexchange.com/questions/164039/what-is-a-zombie-process-or-thread

1 Ответов

Рейтинг:
0

KarstenK

в ваших циклах while (true) должна быть какая-то логика выхода. Некоторые правильные вещи: глобальная память, событие или дескриптор. Выбирайте лучшее.

И вы должны контролировать количество открытых потоков, чтобы сбалансировать использование ресурсов.


Mahmoud_Gamal

ваше решение логично и я сделаю это но есть службы которые подключаются к этому все время без ограничений нужно все обрабатывать