2016-10-03 5 views
1

以下のコードを記述しましたが、実行するとセグメント化エラーが発生します。それは正しくコンパイルします。私の間違いはどこですか?スレッドからのセグメント化エラー

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 
static int N = 5; 
static void* run(void *arg) { 
    int *i = (int *) arg; 
    char buf[123]; 
    snprintf(buf, sizeof(buf), "thread %d", *i); 
    return buf; 
} 

int main(int argc, char *argv[]) { 
    int i; 
    pthread_t *pt = NULL; 
    for (i = 0; i < N; i++) { 
    pthread_create(pt, NULL, run, &i); 
    } 
    return EXIT_SUCCESS; 
} 

すべてのヒントが歓迎されます。おそらくセグメンテーションフォルトの原因となるpthread_create()にNULLを渡している

1):

は、あなたがのserveralの問題を持っているあなたに

答えて

2

ありがとうございます。

2)スレッドが完了するのを待たずに(mainスレッドがプロセス全体を終了するとき)

3)同じアドレス変数iをすべてのスレッドに渡しています。これはデータ競争です。

4)ローカル変数bufのアドレスをスレッド関数から返します。

あなたは好きでそれを修正することができます:あなたはpthread_join()呼び出しを使用する必要はありません

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 
static int N = 5; 
static void* run(void *arg) { 
    int *i = (int *) arg; 
    char *buf = malloc(16); 
    snprintf(buf, 16, "thread %d", *i); 
    return buf; 
} 

int main(int argc, char *argv[]) { 
    int i; 
    void *ret; 
    int arr[N]; 
    pthread_t pt[N]; 

    for (i = 0; i < N; i++) { 
    arr[i] = i; 
    pthread_create(&pt[i], NULL, run, &arr[i]); 
    } 

    for (i = 0; i < N; i++) { 
    pthread_join(pt[i], &ret); 
    printf("Thread %d returned: %s\n", i, (char*)ret); 
    free(ret); 
    } 
    return EXIT_SUCCESS; 
} 

注意を。また、メインスレッドからのpthread_exit()の呼び出しによって、メインスレッド出口と他のスレッドだけが続行されるようにすることもできます。

関連する問題