Как перейти на зомби-поток в 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