2016-09-08 1 views
0

Ich versuche, einen Thread in Hauptfunktion zu erstellen und eine Funktion einer anderen Klasse über meine aufrufen Faden.kann nicht konvertieren vom Typ void * (Klassenname) (void *) in void * (*) (void *) in einem Pthread

In main.cpp:

SocketHandler *callserver; 
pthread_t thread1; 
pthread_create(&thread1,0, callserver->createSocket,NULL); 

und in SocketHandler.h:

void* createSocket(); 

und in SocketHandler.cpp:

void * SocketHandler::createSocket() 
{ 
    //.... 
} 

Als ich Haupt zu kompilieren versuchen. cpp Ich erhalte einen Fehler

cannot convert SocketHandler::createSocket from type void* (SocketHandler::)() to type void* (*)(void*) 
+2

Eine nicht statische Elementfunktion kann nicht als einfache Threadfunktion verwendet werden. Sie benötigen eine statische Elementfunktion oder eine Nichtmitgliedsfunktion. Oh, und natürlich welche Funktion Sie auch verwenden, es muss tatsächlich ein 'void *' Argument nehmen. Oder du könntest natürlich mit der Zeit gehen und anfangen, ['std :: thread'] zu benutzen (http://en.cppreference.com/w/cpp/thread/thread). –

+1

Wenn Sie C++ 11 oder höher haben, würde ich vorschlagen, dass Sie den von der Bibliothek bereitgestellten 'std :: thread 'verwenden, damit Sie nicht mit' void * 's herumfummeln müssen. – NathanOliver

+0

@NathanOliver oder verwenden Sie 'boost :: thread' für pre C++ 11 – Slava

Antwort

3

pthread_create() akzeptiert nur Zeiger auf reguläre Funktionen oder Klassenfunktionen, nicht auf Member-Funktionen. Und dieser Zeiger muss void *(*)(void *) sein. Zur Umgehung können Sie als nächstes tun:

void *trampoline(void *arg) { 
    SocketHandler *callServer = static_cast<SocketHandler *>(arg); 
    callServer->createSocket(); 
    return nullptr; 
} 

// ... 
SocketHandler *callserver; 
pthread_t thread1; 
pthread_create(&thread1,0, trampoline, callserver); 

trampoline() kann inlined werden:

pthread_create(&thread1, 0, [](void* ptr){static_cast<SocketHandler*>(ptr)->createSocket(); return (void*)nullptr;}, callserver); 

Alternativ können Sie std::thread verwenden, die zu mit der Member-Funktionen schmerzlos erlaubt.

+0

Gefaltet in: besser inline als in Kommentaren. – Yakk

Verwandte Themen