2017-03-16 57 views
0

我想比較有關添加兩個矩陣的方法的性能。 一種方法只是添加。另一種方法是使用線程。線程訪問靜態變量導致分段錯誤

但是當線程訪問靜態變量時,我遇到了分段錯誤的麻煩!

這是我的代碼。

的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我使用-static -lpthread選項。

我確定訪問靜態變量會導致分段錯誤 ,因爲此程序在到達訪問靜態變量的代碼行之前先打印一些消息。

這是結果。

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

請別人幫我..!

+2

'#include ',不要強制轉換'malloc'的返回值並編譯警告。另外,向線程發送'&i'將不會做你認爲它的作用(線程可能會得到'i'的更晚的值)。 – Art

+1

靜態使你的變量只能在當前文件中訪問(有點像私人),所以你的靜態變量是每個文件中的2個不同的變量,我想。爲什麼你希望它首先是靜態的?成爲全球化還不夠嗎? –

+0

Kami Kaze的解釋註釋:您有'inputVec1'指針變量的**兩個實例**,它們都在'matrixProcessor.h'中定義*。 'main.c'中的代碼使用*第一個*實例:它用'malloc()'調用初始化它。代碼在'matrixProcessor中。c'使用*變量的第二個*實例,並且此變量未初始化。因此,當試圖解引用該變量的實例時,會出現「Segmenration Fault」。 – Tsyvarev

回答

0

你的代碼有多個問題。下面列出了直接跳到我身上的那兩個。

首先,這一個:

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

什麼的當子線程訪問它i價值?它可以是任何東西,因爲它隨着主線程產生更多的線程並繼續運行而改變。

其次,你有什麼感想時,他們正在執行這些free()報表做,而子線程仍在運行

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

當你的代碼,使這些電話中,子線程仍在運行以來您不要撥打pthread_join()以確保他們全部完成。

您可能會因爲您的線程正在訪問free()的內存而導致分段違例。

+0

感謝Henle!我解決這些問題 – Holden