2017-03-16 12 views
0

私は2つの行列を追加する方法のパフォーマンスを比較しようとしています。 1つの方法で追加するだけです。 もう1つの方法はスレッドを使用することです。スレッドアクセス静的変数の原因セグメンテーションエラー

しかし、スレッドが静的変数にアクセスすると、セグメント化エラーに関する問題が発生します。

ここに私のコードです。

main.cの

#include "matrixProcessor.h" 

void main() 
{ 

    time_t s0, e0; 
    int i; 
    int status; 

    inputVec1 = (int*)malloc(sizeof(int)*(SIZE*SIZE)); 
    inputVec2 = (int*)malloc(sizeof(int)*(SIZE*SIZE)); 
    outputVec = (int*)malloc(sizeof(int)*(SIZE*SIZE)); 

    srand(time(NULL)); 

    initializeVector(inputVec1); 
    initializeVector(inputVec2); 

    //printf("=== INPUT VECTOR 1 ===\n"); 
    //printVector(inputVec1); 
    //printf("=== INPUT VECTOR 1===\n"); 
    //printVector(inputVec2); 

    //s0 = clock(); 
    //addVec(inputVec1, inputVec2, outputVec); 
    //e0 = clock(); 

    //printf("Basic Method Time : %f (s)\n",(double)(e0-s0)/CLOCKS_PER_SEC); 

    s0 = clock(); 

    for(i = 0; i < NUM_THREAD; i++) 
    { 
     printf("%d-Thread Call\n",i); 

     pthread_create(&tid[i], NULL, &addProc, (void*)&i); 
     sleep(1); 
    } 

    e0 = clock(); 

    printf("=== OUTPUT VECTOR===\n"); 
    printVector(outputVec); 

    printf("Thread Method Time : %f (s)\n",(double)(e0-s0)/CLOCKS_PER_SEC); 

    free(inputVec1); 
    free(inputVec2); 
    free(outputVec); 

} 

matrixProcessor.c

#include "matrixProcessor.h" 


void initializeVector(int* matPtr) 
{ 
    int i = 0; 

    for(i = 0; i < SIZE*SIZE ; i++) 
    { 
     matPtr[i] = rand()%100; 
    } 
} 

void addVec(int* inputVec1, int* inputVec2, int* outputVec) 
{ 
    int i = 0; 

    for(i = 0; i < SIZE * SIZE; i++) 
    { 
     outputVec[i] = inputVec1[i] + inputVec2[i]; 
    } 
} 

void* addProc(void *p) 
{ 
    int* idx = (int*)p; 
    int count = (SIZE * SIZE)/NUM_THREAD; 
    int i; 

    printf("idx value : %d\n",*idx); 
    printf("Test : %d ", inputVec1[0]); 

    for(i = (*idx) * count ; i < (*idx)*count + count; i++) 
    { 
     outputVec[i] = inputVec1[i] + inputVec2[i]; 

    } 
    return NULL; 
} 

void printVector(int* vec) 
{ 
    int i = 0; 
    int j = 0; 

    for(i = 0; i < SIZE ; i++) 
    { 
     for(j = 0; j < SIZE; j++) 
     { 
      printf("%d\t", vec[SIZE * i + j]);   
     } 
     printf("\n"); 
    } 
} 

matrixProcessor.h

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <pthread.h> 

#define SIZE 10 
#define NUM_THREAD 10 

pthread_t tid[NUM_THREAD]; 

static int* inputVec1; 
static int* inputVec2; 
static int* outputVec; 

void initializeVector(int* matPtr); 

void printVector(int* vec); 
void addVec(int* inputVec1, int* inputVec2, int* outputVec); 
void* addProc(void *p); 

compil私は、静的 - lpthreadオプションを使用します。

固定変数にアクセスするコード行に達する前に、このプログラムがいくつかのメッセージを出力するため、静的変数の原因セグメンテーションエラー、 があると確信しています。

ここに結果があります。

0-Thread Call 
idx value : 0 
Segmentation Error! ./main 

私を助けてください..!

+2

'#include '、 'malloc'の戻り値をキャストして警告でコンパイルしないでください。また、 '&i'をスレッドに送ることは、あなたが思っていることをしません(スレッドはかなり後に' i'の値を得るかもしれません)。 – Art

+1

staticはあなたの変数を現在のファイル(私的なものと同じように)だけにアクセス可能にするので、静的変数は各ファイルの2つの異なる変数です。なぜあなたはそれが最初に静的であることを望んでいますか?グローバル化するには十分ではないでしょうか? –

+0

仮面ライダーの解説: 'inputVec1'ポインタ変数のインスタンスが** 2つあります。どちらも* matrixProcessor.hで定義されています。 'main.c'のコードは最初の*インスタンスを使用します:' malloc() '呼び出しで初期化します。 'matrixProcessorのコード。c'は変数の2番目の*インスタンスを使用し、この変数は初期化されません。したがって、その変数のインスタンスを逆参照しようとすると、 "Segmenration Fault"が発生します。 – Tsyvarev

答えて

0

コードに複数の問題があります。すぐに私に飛びつく2つは以下の通りです。

まず、この1:

pthread_create(&tid[i], NULL, &addProc, (void*)&i); 

子スレッドがアクセスiの値は何ですか?これは、メインスレッドがより多くのスレッドを生成して実行を続けると変更されるため、何でもかまいません。

第二に、あなたは子スレッドがまだを実行している間、彼らはを実行しているときに、これらのfree()文は何だと思います:

free(inputVec1); 
free(inputVec2); 
free(outputVec); 

あなたのコードは、これらの呼び出しを行うと、子スレッドがまだ以来実行されています彼らがすべて完了したことを確認するためにpthread_join()に電話することはありません。

スレッドがfree()のメモリにアクセスしているため、セグメンテーション違反が発生する可能性があります。

+0

ありがとうHenle!私はこれらを解決する – Holden