LINUX.ORG.RU

О pthread's & c++


0

0

Вопрос в следующем:
Сделал класс для мультисридного сервера но кода thread отработал
он должен уничтожить свой объект
....
void* MyClass::TreadProc(void* p)
{
      MyClass* ptrClass = (MyClass*)p;
      ptrClass->Process();
      if(ptrClass->Auto)
        {
           delete ptrClass;
        }
    return (void*)0;
}
....
пускается он
.....
    if( pthread_create(&th,NULL,ThreadProc,(void*)this)!=0) throw() __Exeption__(THREAD_ERROR);
.....
то после уничтожения класса остается 4 байта d ps -aux
а если я его после запуска pthread_detach()-ну
и в ThreadProc()
дописываю 
....
void* MyClass::TreadProc(void* p)
{
  pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED,0x00);
  pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,0x00);
}
то все класс, но мне надо неотсоединять нить, и дождаться ее "join" в деструкторе, что делать
anonymous

ну и что мешает pthread_join ?

anonymous
()

деструктор вызывается из нити, и если в деструкторе налить join, то они будут ждать друг друга ))

anonymous
()

Честно говоря, не совсем понятно, зачем для этого примера в деструкторе ждать завершения потока.
Ведь работу поток уже выполнил.
Если тебя _не интересует_ что возвратит поток после завершения, то смело пользуй отсоединяемые потоки.
Если же тебе нужно знать код завершения - пересмотри модель, по-моему она у тебя немного кривая.
(Вопрос: если создать поток не вызовом new MyClass, а статически? Что произойдёт при работе такой программы? Может нужно всё же реализовывать сервер немного по-другому?).

romanSA
()

Так в том и дело то, что есть две ситуации, при одной не надо дожижаться завершения, а в другой надо, нити, вообщето выбрасывать нити без присмотра плохой тон, хотелось что-бы по завершению работы деструктора все было чисто, и мне не так важен результат, как достоверное завершение нити, т.к. пока деструктор не завершится то счетчик кол-во объектов не уменьшится, соответственно, будет действовать ограничение MAX_OBJECTS, а по поводу статически создаваемых объектов в этом случае, то это уместно только для одного соединения, а для 50 иди 200 --- печально, с fork() проблем нет, но концепция не очень устраивает в этой задаче, скорее совсем не устраивает )

anonymous
()

И в чём же печаль статически создаваемых объектов?

А по поводу архитектуры...

1) Включаем pthread_join в деструктор класса потока
2) Создаём поток с помощью new и записываем указатель на него в глобальный список (Нужен ещё один поток, следящий за этим списком).
3) В запущенном потоке через pthread_cleanup_push устанавливаем обработчик, который сработает при любом завершении потока.
В обработчике извещаем поток следящий за списком, что рабочий поток такой-то завершён.
4) Следящий поток вызывает delete для соответствующего объекта и в деструкторе срабатывает pthread_join

Таким образом, все проблемы решены. Если есть другие предложения, то рад выслушать :)


romanSA
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.