Привет, ребята, У меня проблема с кодом, и я не знаю, как ее исправить (Ошибка сегментации (ядро сброшено))!
Поэтому мой учитель хочет, чтобы я написал программу, которая создает N ступеней и заставляет их делать некоторые вычисления. У меня есть 3 глобальных 2d массива A, B, C (у меня есть их в качестве указателей, потому что я не знаю размер, пользователь дает его какаргумент). Я пытаюсь выделить им память в основной функции.
Так что проблема в том, что я получаю ошибку сегментации, когда пытаюсь создать шаги в "pthread_create (& tid [id], NULL, add,(void *) (long) i); ":(. Я не могу понять, почему это происходит. Я попытался использовать команду gdb, но результат был в том, что проблема в pthread_create.
Однако, когда я комментировал массивы (A, B,C) и используется malloc, который запускается (но окончательный результат равен 0).
Я использую виртуальный ящик (с Ubuntu внутри, если это помогает: D).
Следующеекод - это то, что я написал до сих пор:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
long int p,N,Total_Sum;
long int **A,**B,**C;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_barrier_t bar;
void * add(void *arg){
long int i,j,Local_Sum=0;
long int lines,start,end,id;
id = (long int)arg;
lines = N/p;
start = id*lines;
end = start+lines;
for(i=start;i<end;i++){
for(j=0;j<N;j++){
A[i][j] = 1;
B[i][j] = 1;
}
}
for(i=start;i<end;i++){
for(j=0;j<N;j++){
C[i][j] = A[i][j] * B[i][j];
Local_Sum += C[i][j];
printf("C[%ld][%ld] = %ld\n",i,j,C[i][j]);
}
}
pthread_mutex_lock(&mutex);
Total_Sum += Local_Sum;
pthread_mutex_unlock(&mutex);
pthread_barrier_wait(&bar);
pthread_exit(0);
}
int main(int argc, char *argv[]){
long int i,j,id;
pthread_t *tid;
if(argc!=3){
printf("Provide Number Of Threads And Size\n");
exit(1);
}
p = atoi(argv[1]);
tid = (pthread_t *) malloc(p*sizeof(pthread_t));
if(tid == NULL){
printf("Could Not Allocate Memory\n");
exit(1);
}
pthread_barrier_init(&bar,NULL,p);
N = atoi(argv[2]);
A = (long int**) malloc(N*sizeof(long int*));
B = (long int**) malloc(N*sizeof(long int*));
C = (long int**) malloc(N*sizeof(long int*));
for(i=0;i<N;i++){
A[i] = (long int*) malloc(N*sizeof(long int));
B[i] = (long int*) malloc(N*sizeof(long int));
C[i] = (long int*) malloc(N*sizeof(long int));
}
if((A==NULL) || (B == NULL) || (C == NULL)){
printf("Count Not Allocate Memory\n");
exit(1);
}
for(i=0;i<p;i++){
pthread_create(&tid[id],NULL,add,(void *)(long) i);
}
for(i=0;i<p;i++){
pthread_join(tid[id],NULL);
}
for(i=0;i<N;i++){
free(A[i]);
free(B[i]);
free(C[i]);
}
free(A);
free(B);
free(C);
printf("Final Result Is Equal To: %ld\n",Total_Sum);
return 0;
}
****** Я знаю, что он немного запутан из-за мьютекса и барьеров, но попросите у меня дальнейшие спецификации: D. ******
Спасибо !!!!!!