Не удалось создать Pthread - PullRequest
       4

Не удалось создать Pthread

0 голосов
/ 15 октября 2018

В настоящее время я работаю над домашним заданием, в котором для выполнения матричного умножения используются несколько потоков, но я продолжаю получать сообщение об ошибке, что все 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];
            }
        }
    }
}

1 Ответ

0 голосов
/ 15 октября 2018

Это работает для меня (под linux).
Может ли это быть что-то в вашей BLOCK обработке?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <errno.h>

// Compile with: gcc -g -Wall threadmult.cpp -o threadmult -lpthread -lstdc++ 

typedef struct 
{
    int threadId;
    int start_row;
    int end_row;
    int start_col;
    int end_col;
} BLOCK;


void * threadMMult(void * arg)
{
    printf("threadMMult()- Thread=%lu with %p BEGINS\n", pthread_self(), arg);
    // TODO - some stuff
    printf("threadMMult()- Thread=%lu with %p ENDS\n", pthread_self(), arg);

    return NULL;
}

int main(void)
{
    int i;
    int errorCode;
    int numberOfThreads = 7;
    // Generate arrays for threads handles
    pthread_t *threadHandles = (pthread_t *) malloc(numberOfThreads*sizeof(pthread_t));
    BLOCK     *blocksOfWork  = (BLOCK *) malloc(numberOfThreads*sizeof(BLOCK));


    // allocate block of work for each thread
    for (i=0; i < numberOfThreads; i++)
    {
        for (i=0; i < numberOfThreads; i++) 
        {
            errorCode = (pthread_create(&threadHandles[i], NULL, threadMMult, &blocksOfWork[i]));
            if (errorCode != 0) 
            {
                printf("pthread %d failed to be created with error code %d", i, errorCode);
                switch (errorCode)
                {
                   // Note to students - don't format your switch() like this
                   // This is OK here, because this is a quick-and-dirty debug program
                   case EAGAIN:  printf(", which is EAGAIN\n"); break;
                   case EINVAL:  printf(", which is EINVAL\n"); break;
                   case EPERM:   printf(", which is EPERM\n"); break;
                   default:   printf(", which is unknown\n"); 
                }
            } 
        }
    }
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...