pthread 사용이 필요한 작업을하고 있습니다. 기본적으로 매트릭스에서 최대 값을 찾고 싶지만 모든 작업을 단일 처리하는 대신 pthreads
을 사용하여 처리합니다. 아래 정의 된대로 하나의 구조체를 사용하여 findMaxPerArea
함수에 여러 값을 입력합니다. 마지막 줄에 pthread_create(...);
을 호출하면 문제가 발생합니다. printf
전에 잘 전달합니다. 제발 너무 바보 같은 실수는 아님을 알아 두십시오. 이견있는 사람? 당신이 포인터에 값을 캐스팅 이후struct pthread_create 호출시 세그먼트 화 오류가 발생했습니다.
pthread_t*
-
threadArr[i]
주조 는
struct inputData{
int ** array;
int start, stop, cols, threadID;
int* localmax;
};
void* findMaxPerArea(void* tmp){
struct inputData* inp = (struct inputData*) tmp;
inp->localmax[inp->threadID] = 0;
int i, j;
for(i = inp->start; i < inp->stop; i++){
for(j = 0; j < inp->cols; j++){
if(inp->array[i][j] > inp->localmax[inp->threadID]) inp->localmax[inp->threadID] = inp->array[i][j];
}
}
}
int main(){
int N, p;
printf("Give me the number of threads\n");
scanf("%d", &p);
printf("Give me the number of rows and columns (one value)\n");
scanf("%d", &N);
int* localmax = malloc(p * sizeof(int));
pthread_t* threadArr = (pthread_t*) malloc(p*sizeof(pthread_t));
int** a = malloc(N * sizeof(int*));
for (int i = 0; i < N; i++) {
a[i] = malloc(N * sizeof(int));
}
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
a[i][j] = 5;
}
}
a[0][1] = 8;
a[1][1] = 13;
struct inputData* inputArray = (struct inputData*) malloc(p * sizeof(struct inputData));
for(int i = 0; i < p; i++){
inputArray[i].array = a;
inputArray[i].start = i*(N/p);
inputArray[i].stop = (N/p)*(i+1) - 1;
inputArray[i].cols = N;
inputArray[i].threadID = i;
inputArray[i].localmax = localmax;
printf("It passes this\n");
pthread_create((pthread_t*)threadArr[i], NULL, findMaxPerArea, (void*)&inputArray[i]);
}}
: 대신 (이미
pthread_t
의 배열을 처리하고 이후) 완전히 캐스트를 생략하고i
번째 요소의 주소를 먹고 싶어 코드를 추론하기가 매우 어렵습니다. 질문의 범위를 [최소한의 완전하고 검증 가능한 예] (https://stackoverflow.com/help/mcve)로 작성하십시오. –내 대답이 업데이트되었습니다.이 코드는 전체 코드입니다. –
캐스트를 사용하지 마십시오. 그것은 간단합니다. (아니, 실제로 그렇게 단순하지는 않지만 때로는 그렇게해야만합니다.) 그러나 첫 번째 근사치로이 규칙이 작동합니다. 단일 캐스트를 작성하지 않고 C와 함께 몇 년 또는 몇 년을 보낼 수 있습니다. 마지막으로 하나를 쓰면 필요합니다. 맞습니다.) –