gpt4 book ai didi

c - 线程访问静态变量导致段错误

转载 作者:行者123 更新时间:2023-11-30 16:48:47 25 4
gpt4 key购买 nike

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

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

这是我的代码。

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

请有人帮助我..!

最佳答案

您的代码中存在多个问题。下面列出了我立即想到的两个。

首先是这个:

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

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

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

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

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

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

关于c - 线程访问静态变量导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42833753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com