私は2つの行列を追加する方法のパフォーマンスを比較しようとしています。 1つの方法で追加するだけです。 もう1つの方法はスレッドを使用することです。スレッドアクセス静的変数の原因セグメンテーションエラー
しかし、スレッドが静的変数にアクセスすると、セグメント化エラーに関する問題が発生します。
ここに私のコードです。
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私は、静的 - lpthreadオプションを使用します。
固定変数にアクセスするコード行に達する前に、このプログラムがいくつかのメッセージを出力するため、静的変数の原因セグメンテーションエラー、 があると確信しています。
ここに結果があります。
0-Thread Call
idx value : 0
Segmentation Error! ./main
私を助けてください..!
'#include'、 'malloc'の戻り値をキャストして警告でコンパイルしないでください。また、 '&i'をスレッドに送ることは、あなたが思っていることをしません(スレッドはかなり後に' i'の値を得るかもしれません)。 –
Art
staticはあなたの変数を現在のファイル(私的なものと同じように)だけにアクセス可能にするので、静的変数は各ファイルの2つの異なる変数です。なぜあなたはそれが最初に静的であることを望んでいますか?グローバル化するには十分ではないでしょうか? –
仮面ライダーの解説: 'inputVec1'ポインタ変数のインスタンスが** 2つあります。どちらも* matrixProcessor.hで定義されています。 'main.c'のコードは最初の*インスタンスを使用します:' malloc() '呼び出しで初期化します。 'matrixProcessorのコード。c'は変数の2番目の*インスタンスを使用し、この変数は初期化されません。したがって、その変数のインスタンスを逆参照しようとすると、 "Segmenration Fault"が発生します。 – Tsyvarev