В настоящее время я работаю над домашним заданием, в котором для выполнения матричного умножения используются несколько потоков, но я продолжаю получать сообщение об ошибке, что все pthreads не удалось создать.Я поместил ниже некоторые фрагменты кода, которые имеют отношение к пространству выделения для потоков, распределению блоков работы для потоков наряду с pthread_create & pthread_join, а затем threadMMulti - это функция, которую использует каждый поток.Моя ошибка исходит из этого куска кода
if (errorCode = pthread_create(&threadHandles[i], NULL, threadMAdd,
&blocksOfWork[i]) != 0) {
printf("pthread %d failed to be created with error code %d\n", i, errorCode);
Так что, насколько я понимаю, pthread_create вернет 0, если поток создан, поэтому очевидно, что pthread_create дает сбой и возвращает число, отличное от 0, поэтому сообщениея посмотрел параметры pthread_create и просто не могу понять, где я ошибаюсь.Если у кого-нибудь есть какие-либо советы или указания в правильном направлении, я был бы признателен.
Фрагменты кода:
typedef struct {
int threadId;
int start_row;
int end_row;
int start_col;
int end_col;
} BLOCK;
// Generate arrays for threads handles
threadHandles = (pthread_t *) malloc(numberOfThreads*sizeof(pthread_t));
blocksOfWork = (BLOCK *) malloc(numberOfThreads*sizeof(BLOCK));
// allocate block of work for each thread
for(i=0; i < numberOfThreads; i++){
blocksOfWork[i].threadId = i;
blocksOfWork[i].start_row = i * rows/numberOfThreads;
if (i == numberOfThreads -1){
blocksOfWork[i].end_row = rows - 1;
}
else{
blocksOfWork[i].end_row = (i+1)*rows/numberOfThreads -1;
}
blocksOfWork[i].start_col = 0;
blocksOfWork[i].end_col = columns -1;
}
for (i=0; i < numberOfThreads; i++) {
if (errorCode = (pthread_create(&threadHandles[i], NULL, threadMMult,
&blocksOfWork[i])) != 0) {
printf("pthread %d failed to be created with error code %d\n", i, errorCode);
} // end if
} // end for
for (i=0; i < numberOfThreads; i++) {
if (errorCode = pthread_join(threadHandles[i], (void **) NULL) != 0) {
printf("pthread %d failed to be joined with error code %d\n", i, errorCode);
} // end if
} // end for
void * threadMMult(void * arg){
BLOCK * block = (BLOCK *) arg;
int threadId = block->threadId;
int startRow = block->start_row;
int endRow = block->end_row;
int startCol = block->start_col;
int endCol = block->end_col;
int i, j, k;
for (int i =startRow; i<=endRow;i++){
for (int j =startCol; i<=endCol; j++){
C[i][j] = 0;
for(int k =0; k<=endCol; k++){
C[i][j] += A[i][k]*B[k][j];
}
}
}
}