2017-01-15 16 views
0

外部ラッパーを使用してpthreadによってメンバー関数を呼び出そうとしていますが、それは私のためにはうまくいかず、segフォルトが発生します。どうしてこれなの? はここに問題を表示する小さなテストプログラムです:pthreadを外部にラップしてメンバーfuncを呼び出す

#include <iostream> 
#include <pthread.h> 
class test {  
    public: 
     test(); 
     ~test(); 
     void RunTh(void); 
    private: 
     pthread_t *pid; 
}; 
void *Run_wrp(void *context); 
void test::RunTh(void) 
{ 
    while(1); 
} 
test::test() 
{ 
    pthread_create(pid,NULL,&Run_wrp,this); 
} 
test::~test(){} 

int main(void) { 
    test tmp; 
    std::cin.get(); 
} 

void *Run_wrp(void *context) 
{ 
    ((test*)context)->RunTh(); 
} 
+1

'pid'はポインタですが、実際の 'pthread_t'オブジェクトではありません。 '*'を削除してから、 'pthread_create()'の呼び出しで '&'を参照解除してみてください。 – sonicwave

+1

また、 'Run_wrp'をクラスの静的メンバー関数にすると、外部ヘルパーに依存する代わりに、その内部にうまく収まるようにすることができます。 – sonicwave

+1

@sonicwaveあなたが最初のコメントを答えに移したら、私はそれを受け入れます! – cerr

答えて

1

あなたpidメンバ変数はポインタだけではなく、実際のpthread_tオブジェクトです。その後

private: 
    pthread_t pid; 

で新しいスレッドを作成します:へ

変更しても

pthread_create(&pid,NULL,&Run_wrp,this); 

あなたがクラスに含まれるすべてのものを維持したい場合は、あなたがstaticあなたRun_wrp()機能を作ることができますメンバー関数がtestの場合、同じシグネチャ(戻り値/引数)を保持している限りです。 static関数はthisのポインタを隠し引数として取り、したがってpthread_create()に必要なものとは異なる署名で終わるので、staticである必要があります。

関連する問題