【问题标题】:Thread access static variable cause segmentation error [duplicate]线程访问静态变量导致分段错误[重复]
【发布时间】:2017-08-07 14:35:48
【问题描述】:

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

但是当线程访问静态变量时,我遇到了分段错误的问题!

这是我的代码。

ma​​in.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);

}

ma​​trixProcessor.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");
    }
}

ma​​trixProcessor.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

请有人帮助我..!

【问题讨论】:

  • #include &lt;stdlib.h&gt;,不要转换malloc的返回值,编译时会出现警告。此外,将&amp;i 发送到线程中不会像您认为的那样做(线程可能会得到更晚的值i)。
  • static 使您的变量只能在当前文件中访问(有点像私有),所以我认为您的静态变量是每个文件中的 2 个不同的变量。为什么你首先希望它是静态的?全球化还不够吗?
  • Kami Kaze 评论的解释:您有 两个实例inputVec1 指针变量,两者都在 matrixProcessor.h定义main.c 中的代码使用 第一个 实例:它使用 malloc() 调用对其进行初始化。 matrixProcessor.c 中的代码使用变量的第二个 实例,并且该变量未初始化。因此,当尝试取消引用该变量的实例时,您会得到“Segmenration Fault”。
  • 感谢 Art,但我认为 malloc 返回内存地址并且 gcc 没有向我显示有关它的警告但分段错误...
  • 谢谢大家,你是对的。我错过了这一点。所以我必须在同一个文件中定义线程函数和静态变量。实际上,我与 JAVA 混淆了,所以我不需要静态。对不起

标签: c multithreading segmentation-fault pthreads


【解决方案1】:

您的代码中存在多个问题。下面列出了对我来说很明显的两个。

首先,这个:

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

子线程访问时i的值是多少?它可以是任何东西,因为它会随着主线程产生更多线程并继续运行而改变。

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

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

当您的代码进行这些调用时,子线程仍在运行,因为您没有调用 pthread_join() 来确保它们已全部完成。

您可能会遇到分段违规,因为您的线程正在访问free()'d 内存。

【讨论】:

  • 谢谢亨利!我解决了这些
猜你喜欢
  • 1970-01-01
  • 2017-10-20
  • 2015-06-12
  • 2013-08-31
  • 2013-01-31
  • 2022-01-03
  • 2011-05-31
  • 2013-12-23
  • 1970-01-01
相关资源
最近更新 更多