2016-10-06 45 views
1

このエラーはデバッグの方法がわかりません。私ができることは、プログラムの一部をコメントアウトし、プログラムのどの部分がエラーを生成したかを追跡するために繰り返しコンパイルすることです。この部分はエラーを生成します:スレッドを作成する際にセグメンテーションフォルト(コアダンプ)エラーが発生する

スレッドを作成します。 :

int j = 0; //not the actual value, just showing that j is of type int 
pthread_create(&thread_id, NULL, strikeMultiples, (void*)j); 

、それはまた、スレッドが作成されたときに呼び出されるstrikeMultiples機能によって引き起こされる可能性が多分:

static void* strikeMultiples(void* prime) { 
    int * primej = (int *) prime; 
    int j = *primej; 
    free (prime); 
    int k; 
    for (k = 2; j * k <= NROF_SIEVE; k++) { 
     BIT_CLEAR(buffer[(j * k)/64], (j * k)%64); 
    } 
    return NULL; 
} 
+2

は、これスレッドPROCで' primej'とその後の間接参照の蓄積が間違っています。 'int j =(int)prime;'は現実に近いですが、まだ正しいとは限りません。正しく実行するためには、procの 'j' inboundと' j'は 'intptr_t'または' uintptr_t'でなければなりません。 'free'は関係なく削除されるべきです。それは、すべての推測です。私たちは、どのようなタイプの 'j'が最初のスニペットにあるのか、それがどこから来るのか分かりません。 – WhozCraig

答えて

2

問題は、あなたが関数にintを渡すことである(にキャストvoid *)続いてint *としてそれを読み取ろうとします。

また、freeには、mallocと家族から返されなかったものがあります。

intの値を渡し、その機能にfreeを入れないでください。また、void *と非関数ポインタの間でキャストする必要はありません。 j`がpthread_create` `に` int`、あなたが渡していない `int型*` `であると仮定すると、

static void* strikeMultiples(void* prime) { 
    int *primej = prime; 
    int j = *primej; 
    int k; 
    for (k = 2; j * k <= NROF_SIEVE; k++) { 
     BIT_CLEAR(buffer[(j * k)/64], (j * k)%64); 
    } 
    return NULL; 
} 

... 

pthread_create(&thread_id, NULL, strikeMultiples, &j); 
+0

注意:スレッド作成者の 'j'は、スレッド内の最後の使用前に自動破壊(スコープの範囲外)に遭遇しないよう注意してください。ローカル自動バールのアドレスをスレッド作成に渡す競合条件は、誤って実行する*簡単*であり、散発的な失敗の性質のために追跡するのは難しい*ことが多いです。 'int'または' unintptr_t'のような値で 'j'を渡すか、スレッドによって解放された動的メモリ、または他の多くのオプションは、これに対して保護します – WhozCraig

関連する問題