2012-03-08 4 views
2

pthreadsを初めて使用しました。何度か私のプログラムが失敗してしまい、たまにそれが失敗するため、私は問題を抱えています。私はリンクされたリストの作成、リストへの項目の追加、リストからの項目の削除といったいくつかの基本的なタスク(C言語で書かれています)を実行する私のプログラムにいくつかの機能を持っています。それぞれの関数はそれ自身のリストを作成するので、私はそれらがお互いに相互作用するとは思わないので、mutexは必要ありません。とにかく、誰かがアイデアを持っている場合、または「一般的な」初心者の間違いがある場合は、以下のコードは私のコードです。リンクリストによるpthreadセグメンテーションフォールト - beginner

私は各機能を1000回並列に実行しますが、何回かはフォールトを起こしています。私は、これらの3つの機能の組み合わせでしか起こらないことに気付きます。

プロセスはこのように書き: - 並列 での実行スレッド - - スレッド を作成し、各スレッドが倍 の与えられた数のタスクを実行するためのダミー関数を呼び出す - ダミー関数も

I他の関数を呼び出すことこれらの関数のすべてがリンクリストノードの作成/削除と関係しているので、メモリ使用量/割り当てと関係している可能性があると考えます。どうもありがとう。ここで

が作成され、参加している:ここで

pthread_create(&t7, NULL, (void*)&p4, (void*)var); 
pthread_create(&t8, NULL, (void*)&p5a, (void*)var); 
pthread_create(&t9, NULL, (void*)&p5b, (void*)var); 
pthread_join(t7, NULL); 
pthread_join(t8, NULL); 
pthread_join(t9, NULL); 

はダミー関数です:ここでは

void p4(int *nptr){ 
    int n = *nptr; 
    // Get current time 
    struct timeval t0, t1; 
    gettimeofday(&t0,0); 

    int i = 0; 
    LIST *list = (LIST*)malloc(sizeof(LIST)); 
     for(i=0;i<n;i++){ 
    f4(list); 
    deleteList(list); 
    } 
    // Get current time and find time elapsed 
    gettimeofday(&t1,0); 
    float elapsed = (t1.tv_sec-t0.tv_sec)*1000000 + t1.tv_usec-t0.tv_usec; 
     printf("Successful execution of p4 in %f microseconds.\n", elapsed); 
    free(list); 
} 
void p5a(int *nptr){ 
    int n = *nptr; 
    LIST *list = (LIST*)malloc(sizeof(LIST)); 
    f4(list); 
    // Get current time 
    struct timeval t0, t1; 
    gettimeofday(&t0,0); 

    int i = 0; 
     for(i=0;i<n;i++){ 
    f5a(list); 
    } 
    // Get current time and find time elapsed 
    gettimeofday(&t1,0); 
    float elapsed = (t1.tv_sec-t0.tv_sec)*1000000 + t1.tv_usec-t0.tv_usec; 
    printf("Successful execution of p5a in %f microseconds.\n", elapsed); 
} 
void p5b(int *nptr){ 
    int n = *nptr; 
    LIST *list = (LIST*)malloc(sizeof(LIST)); 
    f4(list); 
    int i = 0; 
     for(i=0;i<n;i++){ 
    f5a(list); 
    } 
    // Get current time 
    struct timeval t0, t1; 
    gettimeofday(&t0,0); 
    for(i=0;i<n;i++){ 
    f5b(list); 
    } 
    // Get current time and find time elapsed 
    gettimeofday(&t1,0); 
    float elapsed = (t1.tv_sec-t0.tv_sec)*1000000 + t1.tv_usec-t0.tv_usec; 
    printf("Successful execution of p5b in %f microseconds.\n", elapsed); 
} 

は、定期的なタスクを実行に使用される機能です:

// FUNCTION: initialize a linked list with pointers and insert a last element 
void f4(LIST *L1){ 
    // initialize an empty linked list if L1 = null 
    if(L1->head == NULL){ 
    NODE *n = (NODE *)malloc(sizeof(NODE)); 
    L1->head = n; 
    L1->tail = n; 
    L1->tail->next = NULL; 
    n->data = 1; 
    } 
    // traverse the linked list to the end 
    NODE *iter = L1->head; 
    while(iter->next != NULL) 
    iter = iter->next; 
    // insert a new 2 element 
    NODE *new = (NODE *)malloc(sizeof(NODE)); 
    new->data = 2; // arbitrary for testing 
    new->next = NULL; 
    iter->next = new; 
    L1->tail = new; 
} 

// FUNCTION: add an item to the end of a list (queue) 
void f5a(LIST *list){ 
    NODE *new = (NODE *)malloc(sizeof(NODE)); 
    new->data = 999; 
    new->next = NULL; 
    list->tail->next = new; 
    list->tail = new; 
} 

// FUNCTION: remove an item from the beginning of a list (queue) 
void f5b(LIST *list){ 
    NODE *remove = list->head; 
    list->head = list->head->next; 
    free(remove); 
} 
+0

をご確認ください。あなたが記憶を共有しているようには見えません。私はあなたのリスト機能をより良くテストすることに目を向けるでしょう。 – Collin

+0

これは重要ではないように見えるかもしれませんが、予約語をvariabe名として使用しないでください。 'new'キーワードはC++で予約されています。あなたのプログラムはC言語ではなくC言語であることは知っていますが、ただの場合は避けてください。たぶん誰か(例えばあなた)がC++に移植したいと思うかもしれません... – sirgeorge

+0

deleteListコードも投稿できますか? – Jay

答えて

3

あなたの場合mallocのマニュアルページを読むと、割り当てられたメモリを0に初期化しないことがわかります。メモリはp4p5aおよびp5bである。その後、f4はLISTコンストを初期化せずに機能します。

p4では、有効なポインタがif(L1->head == NULL)であることを確認しますが、nullではない可能性があります。したがって、L1->headのメモリを割り当てずに、この関数の後にf5b関数では、割り当てられていないポインタを解放しています。

アドバイス:

  • 常に割り当てられた領域を初期化します。
  • 常に私はスレッドがこれを行うには何を持っている疑いmalloc返さポインタ
+0

あなたの洞察をいただきありがとうございます。これが問題でした。私は頭をNULLに初期化し、すべては許された。 – mathjacks

関連する問題