2016-06-27 14 views
2

pthreadがどのように動作するのかちょっと混乱しています。具体的には、voidポインタを引数として取る関数へのポインタをpthreadが受け取っていると確信しています。私はそのように関数を宣言しましたが、私はまだエラーが発生しています。私は取得していますエラーがあるPthreadと関数ポインタ

void eva::OSDAccessibility::_resumeWrapper(void* x) 
{ 
    logdbg("Starting Connection."); 
    _listener->resume(); 
    logdbg("Connected."); 
    pthread_exit(NULL); 
} 

void eva::OSDAccessibility::resumeConnection() 
{  
    long t; 
    _listener->setDelegate(_TD); 
    pthread_t threads[1]; 
    pthread_create(&threads[0], NULL, &eva::OSDAccessibility::_resumeWrapper, (void *)t); 

} 

No matching function for call to pthread_create. 

あなたは、必ずしもそれが可能だろうが(コードを修正する方法を教えする必要はありませんここで私はに苦しんでいたコードですもちろん)、私はこのエラーが起こっている理由とpthreadの私の理解が正しい場合にはより興味があります。ありがとう! :)

+2

CまたはC++を使用していますか? C++を使用している場合は、[標準スレッドライブラリ](http://en.cppreference.com/w/cpp/header/thread)を使用することをお勧めします。 – NathanOliver

+0

提案していただきありがとうございます!そして、私は何が起こっているのか理解するかもしれないと思う。クラス内のメンバ関数でpthreadを実際に使用することはできません。これを行う良い方法は、main()でクラスのインスタンスを作成し、そこからpthread_createを呼び出すことです。私は想像するでしょう... –

答えて

2
  1. あなたの関数シグネチャは、C++コードから呼び出された場合void * function (void*)

  2. である必要があり、この方法は、静的でなければならない:

    class myClass 
    { 
        public: 
        static void * function(void *); 
    } 
    

解決策ではない方法を使用しますstaticは次のとおりです。

class myClass 
{ 
    // the interesting function that is not an acceptable parameter of pthread_create 
    void * function(); 

    public: 
    // the thread entry point 
    static void * functionEntryPoint(void *p) 
    { 
     ((myClass*)p)->function(); 
    } 
} 

スレッドを起動する:

myClass *p = ...; 
pthread_create(&tid, NULL, myClass::functionEntryPoint, p); 
+0

'extern C'はどうですか? 1つはそれを指定する必要がありますか? – a3f

+0

ありがとう!私は今、私の問題を得ると思う、私はpthreadでは不可能な非静的メンバー関数を呼び出そうとしていた。これは、多くのおかげで、助けて! –