C++/multi-thread ongelma

Hello,

Eli ongelma on seuraava:

Yritin tämän esimerkin pohjalta tehdä monisäikeistä ohjelmaa:http://www.linuxselfhelp.com/HOWTO/C++Programming-HOWTO-18.html

Ohjelman ajo ei koskaan valu tuossa EntryPointiin, missä vika.

käytössäni on FedoraCore 13, g++ versio 4.4.4 20100630.

koodin kääntö ja linkitys onnistuu ilman virheitä eli käytän tuota -lpthread vipua.

Tässä koodia:

class Thread
{
   public:
      Thread();
      int Start(void * arg);
   protected:
      int Run(void * arg);
      static void * EntryPoint(void*);
      virtual void Setup();
      virtual void Execute(void*);
      void * Arg() const {return Arg_;}
      void Arg(void* a){Arg_ = a;}
   private:
      THREADID ThreadId_;
      void * Arg_;

};

int Thread::Start(void * arg)
{
   Arg(arg); // store user data	

   return pthread_create(&ThreadId_, NULL, Thread::EntryPoint, (void*)this );
}

int Thread::Run(void * arg)
{
   Setup();
   Execute( arg );
}

void * Thread::EntryPoint(void * pthis)
{
   // ohjelma ei valu koskaan tänne
   Thread * pt = (Thread*)pthis;
   pthis->Run( Arg() );
}

virtual void Thread::Setup()
{
        // Do any setup here
}

virtual void Thread::Execute(void* arg)
{
        // Your code goes here
        while(1)
        {
           // koodia jne...
        }
}

// itse koodin testaus 

int main()
{
  int ret = -1;
  Thread *p = NULL;
  p = new Thread();
  if(p)
  {
    ret = p->Start((void*)str);
    
    // ret = 0, joten thread on luotu.
  }

  if(p)
    delete p;	

}

Tuo thread_create palauttaa 0:llan joka viittaa siihen että säikeen luonti onnistui,
kuitenkaan entrypointiin ei pääse? missä vika?

/Kingpin

Asia ratkaistu:

  1. pistin testaavaavn koodiin while-silmukan ettei valuta ulos ohjelmasta
  2. entrypoint metodiin reinterpret_cast parametrille

void * Thread::EntryPoint(void * pthis)
{
   Thread * pt = NULL;
   pt = reinterpret_cast<Thread *>(pthis);
   if(pt) 
      pt->Run( Arg() );
}


// itse koodin testaus 

int main()
{
  int ret = -1;
  Thread *p = NULL;
  p = new Thread();
  if(p)
  {
    ret = p->Start((void*)str);
    
    // ret = 0, joten thread on luotu.

     // eipäs valuta ohjelman loppuun
     while(1)
     {


     }
  }

  if(p)
    delete p;	

}

/kingpin