【发布时间】:2017-08-07 14:35:48
【问题描述】:
我正在尝试比较添加两个矩阵的方法的性能。 一种方法是添加。 另一种方法是使用线程。
但是当线程访问静态变量时,我遇到了分段错误的问题!
这是我的代码。
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);
编译时,我使用 -static - lpthread 选项。
我确定访问静态变量会导致分段错误, 因为这个程序在到达访问静态变量的代码行之前会打印一些消息。
这是结果。
0-Thread Call
idx value : 0
Segmentation Error! ./main
请有人帮助我..!
【问题讨论】:
-
#include <stdlib.h>,不要转换malloc的返回值,编译时会出现警告。此外,将&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