2017-03-16 61 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