nixp.ru v3.0

21 октября 2017,
суббота,
07:48:27 MSK

DevOps с компанией «Флант»
decvar написал 15 декабря 2005 года в 14:33 (615 просмотров) Ведет себя как мужчина; открыл 111 тему в форуме, оставил 1838 комментариев на сайте.

есть вот такой код:

#ifndef _WIN32
void * DoThread(void * ptr)
{
      CProvider * provider = (CProvider*)ptr;
      std::cout << ">now casting provider ptr to class instanse...";
      if(provider != NULL)
      {
            std::cout << "[done]" << std::endl;
            provider->threadImpl();
      }
      else
            std::cout << "[error]" << std::endl;
}
//Linux version thread
void CProvider::StartThread()
{
      int r = pthread_create(&m_thread, &m_attrs, DoThread,
                        reinterpret_cast(this));
      if(r!=0)
            std::cout <<
            ">can't start new pthread, code " <<
            r <<
            std::endl;
}
#endif

метод CProvider::threadImpl() тоже просто метод этого класса…

При попытке вызова StartThread(); вылетает segfault на моменте provider->threadImpl() внутри DoThread()

Что-то я не пойму чего ему для счастя надо?

Longobard

А если вместо threadImpl поставить ф-ю CProvider::TestFunc(int a) { std::cout << a << std::endl; } то как себя будет вести программа? Это позволит определить, проблема ли в threadImpl или же где-то в другом месте.

decvar

проблема не с threadImpl(), так как там сразу же стоит std::cout

//////////////////////////////////////////////////////////////////////////
// This is listner thread implementation
// should not be called directly
//////////////////////////////////////////////////////////////////////////
unsigned int CProvider::threadImpl()
{
      // here we are going to listen on the network
      std::cout << ">starting listner thread";
      int sockfd, newsockfd;
      socklen_t clilen;
      char buffer[MAX_SIZE];
      struct sockaddr_in serv_addr, cli_addr;
...
...
...

а выпадает оно так:

decvar@dhcp0-253:~/codding/client> ./client

>there is more than one interface.

>self ip : 192.168.0.253

>now casting provider ptr to class instanse…[done]

Segmentation fault

decvar@dhcp0-253:~/codding/client>

Longobard

Хм, интересная трабла :) Вечером прийду — разберусь. Если найдешь причину — отпишись тут, ок?

Uncle Theodore

Попробуй дебаггером. Valgrind должен сказать немного больше, чем «segfault».

Good Luck,

UT

rgo

а этот *this внутре StartThread… ты под него память откуда берёшь — из стека или из кучи?

И вообще, давай колись на завершённую программу. я по своему разумению дописал, у меня это работает. причём как из стека, так и из кучи. valgrind чтой-то ругается, но я думаю что это проблемы glibc.

вот это работает:

#include 
#include 
#include 
class CProvider
{
public:
      CProvider () {
            pthread_attr_init (&m_attrs);
      }
      void StartThread ();
      void threadImpl ();
protected:
      pthread_attr_t m_attrs;
      pthread_t m_thread;
};  
extern "C" void * DoThread(void * ptr)
{
      CProvider * provider = (CProvider*)ptr;
      std::cout << ">now casting provider ptr to class instanse...";
      if(provider != NULL)
      {
            std::cout << "[done]" << std::endl;
            provider->threadImpl();
      }
      else
            std::cout << "[error]" << std::endl;
      return NULL;
}
void CProvider::threadImpl ()
{
      std::cout << "IEeee-Ha-aa\n";
      return;
}
//Linux version thread
void CProvider::StartThread()
{
      int r = pthread_create(&m_thread, &m_attrs, DoThread,
                       reinterpret_cast(this));
      if(r!=0)
            std::cout <<  
            ">can't start new pthread, code " <<  
            r <<
            std::endl;
}
int main ()
{
      CProvider *prov = new CProvider;
      prov->StartThread ();
      usleep (100);
      printf ("done\n");
      return 0;
}
decvar
И вообще, давай колись на завершённую программу.

все ~450 исходников? Да тут и NDA не даст :)

На самом деле я просто старый пожиратель кореньев, так как ключевая строка :

pthread_attr_init (&m_attrs)

Всем спасибо за участиет….