我正在嘗試運行我撰寫的用于乘以 NxN 矩陣平方的程式。但是,我遇到了分段錯誤。我有沒有執行緒的程式的作業代碼。但是我沒有成功地為多執行緒改編我的代碼。我正在嘗試在樹莓派 4 上運行代碼。除錯器指出以下行是我收到錯誤信號 SIGSEGV 的地方:
args.A[i][j] = rand() % 100;
我曾嘗試將 printf 陳述句放在我分配記憶體的代碼部分周圍,但它們從未運行過,因此我假設段錯誤發生在任何代碼實際運行之前。我在互聯網上做了一些關于解決段錯誤的研究,那是我嘗試使用除錯器的時候,但我不明白為什么它在設定矩陣元素時會出現問題。特別是因為我以前的非執行緒程式具有相同的代碼行并且運行時沒有任何錯誤。反饋將不勝感激。以下是我的代碼:
/* Program must be passed exactly one integer that satisfies the following condition:
* N % n = 0, where N is the square matrices' dimensions and n is the number of threads.
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>
#define N 2000
typedef struct __myarg_t
{
FILE *Aptr, *Bptr, *Cptr; // Files containing the matrices
int **A, **B, **C, **T; // Matrices A , B, resultant and transpose of B
int rows; // Number of rows each thread computes
int cur; // Current thread number
} myarg_t;
void *mythread(void *arg)
{
myarg_t *m = (myarg_t *) arg;
int start = m->cur * m->rows;
int end = start m->rows;
// Matrix Multiplication for rows start:(end - 1)
for (int i = start; i < end; i )
{
for (int j = start; j < end; j )
{
int num = 0;
for (int k = 0; k < N; k )
{
num = m->A[i][k] * m->T[j][k];
}
m->C[i][j] = num;
}
}
return NULL;
}
int main(int argc, char *argv[])
{
if (argc != 2)
{
fprintf(stderr, "usage: main-first <#ofthreads>\n");
exit(1);
}
pthread_t *thread;
clock_t tic, toc;
myarg_t args;
int rc, n;
args.cur = 0;
args.rows = N/n;
n = atoi(argv[1]);
args.Aptr = fopen("A_multi.txt", "w");
args.Bptr = fopen("B_multi.txt", "w");
args.Cptr = fopen("C_multi.txt", "w");
args.A = (int**)malloc(N * sizeof(int*));
args.B = (int**)malloc(N * sizeof(int*));
args.C = (int**)malloc(N * sizeof(int*));
args.T = (int**)malloc(N * sizeof(int*));
thread = (pthread_t *)malloc(n * sizeof(pthread_t));
// Dynamically allocate memory for 2D Array
for (int i = 0; i < N; i )
{
args.A[i] = (int*)malloc(N * sizeof(int*));
args.B[i] = (int*)malloc(N * sizeof(int*));
args.C[i] = (int*)malloc(N * sizeof(int*));
args.T[i] = (int*)malloc(N * sizeof(int*));
}
// Assign values to the elements of the Matrices
for (int i = 0; i < N; i )
{
for (int j = 0; j < N; i )
{
args.A[i][j] = rand() % 100;
args.B[i][j] = rand() % 100;
args.T[j][i] = args.B[i][j];
}
}
tic = clock();
// Create threads
for (int i = 0; i < n; i )
{
rc = pthread_create(&thread[i], NULL, mythread, &args);
if (rc != 0)
{
printf("pthread_create failed with thread %d.\n", i);
exit(1);
}
}
// Wait for threads to complete
for (int i = 0; i < n; i )
{
rc = pthread_join(thread[i], NULL);
if (rc != 0)
{
printf("ptphread_join failed with thread %d.\n", i);
exit(1);
}
}
toc = clock();
printf("Elapsed: %f seconds\n", (double)(toc - tic) / CLOCKS_PER_SEC);
// Write matrices to their output files
for (int i = 0; i < N; i )
{
for (int j = 0; j < N; j )
{
fprintf(args.Aptr, "%d ", args.A[i][j]);
fprintf(args.Bptr, "%d ", args.B[i][j]);
fprintf(args.Cptr, "%d ", args.C[i][j]);
}
fprintf(args.Aptr, "\n");
fprintf(args.Bptr, "\n");
fprintf(args.Cptr, "\n");
}
// Deallocate memory
for (int i = 0; i < N; i )
{
free(args.A[i]);
free(args.B[i]);
free(args.C[i]);
free(args.T[i]);
}
free(args.A);
free(args.B);
free(args.C);
free(args.T);
fclose(args.Aptr);
fclose(args.Bptr);
fclose(args.Cptr);
return 0;
}
uj5u.com熱心網友回復:
- 改變:
int rc, n;
...
args.rows = N/n;
n = atoi(argv[1]);
至:
int rc;
...
int n = atoi(argv[1]);
if(!n) {
// atoi() will return for "0" or error
}
args.rows = N/n;
- “賦值”注釋后的第二個回圈可能會增加錯誤的變數
i,但應該是j. 否則i將2 * (N-1)which will overflow the arraysA,BwhichTare of hasNelements 。這將導致您的段錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/537438.html
上一篇:udp廣播是否會環回?
下一篇:如何改變扇區在矩陣中的位置?
