2011-04-03 11 views
2

私のプログラムで 'pthread_create'メソッドを使用していて、このメソッドの中にセグメンテーション違反があります。
これはおそらく何が原因でしょうか?私は正しい引数の型でこの関数を呼び出しています!pthread_segmentation fault

これはコードです:

pthread_t* _daemon; 


void* writer(void* arg){ 
    // stuff that dont involve "arg"... 
} 


int initdevice(){ 
    if(pthread_create(_daemon, NULL, &writer, NULL) != 0) //seg in this line 
    { 

     cerr << "system error\n"; 
     return ERR_CODE; 
    } 
    return SUCCESS; 
} 

int main() { 
    initdevice(); 
    return 0; 
} 

注:私はpthread_createの中にライターに呼び出す前に、「&」なしでも、それを実行しようとした、とも - 私たちは、このメソッドに送信しようとしました最後のNULL引き数の代わりにいくつかのvoid *引き数。

+4

この呼び出しの周りで使用するコードを投稿すると、おそらく正しく実行されていない可能性があります。 – Mat

+0

問題は行番号17にあると思います。 – Nawaz

+1

グローバル変数の最初の文字としてアンダースコア '_'を使用しないでください(変数の先頭には使用しないでください)。 [これらの識別子はコンパイラとOS用に予約されている](http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-ac-identifier/228797#228797 )。 –

答えて

13

あなたprobelemはここにある:

pthread_t* _daemon; 

これは次のようになります。アイデアはpthread_createのはへのポインタを取ることです

if(pthread_create(&daemon, NULL, &writer, NULL) != 0) 

pthread_t daemon; 

その後のpthread_createの呼び出しを変更します既存の pthread_tオブジェクトです私は詳細を記しています。あなたはそれをコンストラクタのCバージョンと考えることができます。最初はpthread_tオブジェクトが初期化されていないので、これが初期化されます。

さらに、スレッドが終了するのを待たずに、コードが常に動作するとは限りません。あなたのメインスレッドは、すべての子供たちの前に完了していないことを確認します:

int main() 
{ 
    initdevice(); 
    pthread_join(daemon, NULL); // wait for the thread to exit first. 
    return 0; 
} 
+0

ありがとう!この違いがなぜこのような大きな混乱を引き起こすのでしょうか? – Zach

+1

@ニッシン:あなたのやり方が間違っているから!あなたは初期化されたポインタを渡しているので(それは何かを指すことができます)、ポインタを介して書き込む関数に渡しています(したがって、メモリ内のどこにでも書き込む)。 –

1

あなたがpointerの使用を持っているので、あなたが、newmalloc機能を_daemonvariableを割り当てる必要があります。

pthread_t* _daemon; 
_daemon = new pthread_t; 
関連する問題