C++ und Posix Threads

Hallo,

Code:
class Test{
           public:
                    void thread_func(void){}
};

int main(void){
  pthread_t p;
   if(pthread_create(&p, NULL, .....) != 0) {
         fprintf (stderr, "Fehler bei Thread %d ...\n",i+1);
         exit (EXIT_FAILURE);
      }
}

Wie kann man einen Posix Thread starten mit einer Methode in einer Klasse die nicht static ist X(
 
Die beste Lösung für sowas die ich bisher gefunden habe sieht ca so aus:

Code:
class test 
{
public:
    static void* call_thread_function(void* p)
    {
        static_cast<test*>(p)->thread_function();
        return 0;
    }
    void thread_function()
    {
        std::cout<<"thread..."<<std::endl;
    }
}; 
....
int main()
{
pthread_t testthread;
test* p = new test;
....
pthread_create(&testthread, NULL, test::call_thread_function, (void*) p);
...
}

Also im Prinzip schreibst du eine statische Wrapper Funktion die einen Pointer auf die aufzurufende Klasse übernimmt und die entsprechende Funktion aufruft.
Eleganter sind da natürlich die boost threads weil die auf C++ ausgelegt sind.
 
Ja, die Boost.Threads benutze ich auch, aber da gibt es keine Möglichkeit einen Thread zu beenden/killen.

Wenn ich z.B. einen Thread habe wie :

Code:
void thread_func(void){
      for(;;){
              socket = accept(...)
              // code
       }
}

für einen Server z.B., dann kan ich den nicht beenden.
 
Es gibt in beiden API's natürlich auch Möglichkeiten den Thread zu killen aber am einfachsten ist doch hier eine boolsche Variable ;)

Code:
void thread_func(void){
     while(thread_running){
              socket = accept(...)
              // code
       }
}

Und die entsprechendeVariable setzt du auf false wenn du den Thread beenden willst.
 
Ja, aber accept() blockiert doch, bis ich eine Verbindung habe.Also müsste ich die Variable auf false setzen und dann noch eine extra Verbindung aufbauen.
 
Zurück
Oben