2016-09-08 29 views
0

main関数でスレッドを作成し、別のクラスの関数をmy糸。 main.cppにはpthread内でvoid *(クラス名)(void *)からvoid *(*)(void *)に変換できません

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

とSocketHandler.hで:

void* createSocket(); 

とSocketHandler.cppで:

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

私はメインコンパイルしようとしています。 cppエラーが発生する

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

非スタティックメンバ関数を単純なスレッド関数として使用することはできません。静的メンバー関数または非メンバー関数が必要です。もちろん、どんな関数を使うにしても、実際には 'void *'引数を取る必要があります。もちろん、時代とともに「[std :: thread'](http://en.cppreference.com/w/cpp/thread/thread)を使い始めることもできます。 –

+1

C++ 11以上をお持ちの場合は、ライブラリによって提供される 'std :: thread'を使用することをお勧めします。そうすれば、' void * 'で悩む必要はありません。 – NathanOliver

+0

@ NathanOliverまたはpre C++ 11のために 'boost :: thread'を使用してください – Slava

答えて

3

pthread_create()通常の関数やクラスの機能に、いないメンバ関数へのポインタのみを受け付けます。そのポインタはvoid *(*)(void *)でなければなりません。あなたは次の操作を行うことができます回避するには:

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()がインライン化されることがあります。

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

また、あなたがstd::threadを使用することができ、それはあまりにもメンバ関数を使用して無痛ことができます。

+0

それを折りたたんでコメントよりもインラインにします。 – Yakk

関連する問題