C-线程访问静态变量原因分割错误



我正在尝试比较有关添加两个矩阵的方法的性能。一种方法只是要添加。另一种方法是使用线程。

但是,当线程访问静态变量时,我对分割错误有麻烦!

这是我的代码。

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 Calln",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 : %dn",*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("%dt", 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);

编译时,我使用-static -lpthread选项。

我敢肯定,访问静态可变原因分割错误,因为此程序在到达访问静态变量的代码线之前会打印一些消息。

这是结果。

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

请有人帮我..!

您的代码中有多个问题。跳到我的两个都在下面列出。

首先,这个:

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

当孩子线程访问它时,i的值是多少?它可以是任何事物,因为它会随着主线程产生更多的线程并继续运行的变化。

第二,您认为这些free()语句在执行时会做什么,而孩子线程仍在运行

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

当您的代码拨打这些电话时,子线程仍在运行,因为您不致电pthread_join()以确保它们都完成。

您可能会违反分割,因为您的线程正在访问free()'D内存。

最新更新