2013-11-25 2 views
1

Итак, когда я запускаю свой код, я получаю ошибку сегментации прямо на pthread_join. После моего pthread_join, который не запускается, появляется инструкция print. Кто-нибудь знает, почему? Не могли бы вы дать мне какие-то намеки или идеи о том, как это понять?Ошибка сегментации в pthread_join

вывод выводит все номера строк для моей матрицы до конца, затем он оставляет функцию matrixCalc и печатает «после создания потоков». Это происходит, когда я вставляю аргумент для 1 потока.

Я включил небольшой раздел моего кода здесь:

int main(int argc, char*argv[]) 
{ 
    //takes in number of threads as 1st arg 
    pthread_attr_init(&attr); 
    //initialize matrix here 

    //passes num of threads through matrixcalc 
    for(i = 0; i < numberOfThreads; i++) 
    { 
     threadCount++; 
     pthread_create(&tid, &attr, matrixCalc(threadCount), NULL); 
    } 
    printf("after threads are created\n"); 
    pthread_join(tid, NULL); 
    printf("after join\n"); 
    exit(0); 
    return 0; 
} 

Здесь матричная функция известково:

void *matrixCalc(threadCount) 
{ 
    int i, j, sum, tempNum, currentRow; 
    currentRow = threadCount; 
    sum=0; 

    while(currentRow < 1200) 
    { 
     //cycles through the column j for matrix B 
     for(j=0; j<500; j++) 
     { 
      //cycles through the diff i values for the set row in matrix A and column in matrix B 
      for(i=0; i<1000; i++) 
      { 
       //Matrix A set i value is at threadcount-1 
       //Matrix B i value = j 
       //Matrix B j value = i 
       //Multiply together and add to sum 
       tempNum = (matrixA[currentRow-1][i])*(matrixB[i][j]); 
       sum = sum+tempNum; 
      } 
      //Set Matrix C at i value = currentRow and jvalue = i to sum 
      matrixC[currentRow-1][j] = sum; 
      //printf("%d\n", matrixC[currentRow-1][i]); 
     } 
     //increase threadcount by number of threads 
     //until you hit max/past max val 
     currentRow = currentRow + nThreads; 
     //printf("%d\n", currentRow); 
    } 
    return NULL; 

} 
+0

Вы должны проверить, если 'pthread_create' терпит неудачу ... –

+0

Могли бы вы вставить функцию matrixCalc? – tyilmaz

+0

@BitFiddlingCodeMonkey, я установил x = pthread_create и проверил, если x! 0, но это = 0. – angyxpoo

ответ

6

При звонке pthread_create() вам необходимо передать адрес функции типа void *(*)(void *). То, что делает код, - это вызов функции там, поэтому его результат переходит к pthread_create().

Изменение этой линии

pthread_create(&tid, &attr, matrixCalc(threadCount), NULL); 

стать

pthread_create(&tid, &attr, matrixCalc, NULL); 

или

pthread_create(&tid, &attr, &matrixCalc, NULL); 

whic на самом деле одно и то же.


Как уже упоминалось выше, функции потока должна быть объявлена ​​как void *(*)(void *).

Так изменить

void *matrixCalc(threadCount) 

стать этим

void * matrixCalc(void *) 

Как видно из кода, кажется, пытается икра от нескольких потоков, и все должны быть соединены perpare комнаты для хранения несколько PTHREAD -ids.

Это может быть, например, сделано с использованием массива следующим образом:

pthread_t tid[numberOfThreads] = {0}; 

Затем создайте нить вроде так:

pthread_create(&tid[i], &attr, matrixCalc, NULL); 

переданного номер потока (счетчика i) вниз к резьбе также дайте ему комнату, определив

int thread_counts[numberOfThreads] = {0}; 

присвоить его и передать его в качестве 4 го параметр при создании потока:

thread_counts[i] = i; 
pthread_create(&tid[i], &attr, matrixCalc, &thread_Counts[i]); 

вниз в функции потока затем получить его необходимости модифицировать

void *matrixCalc(threadCount) 
{ 
    int i, j, sum, tempNum, currentRow; 
    currentRow = threadCount; 
    ... 

как так:

void * matrixCalc(void * pv) 
{ 
    int i, j, sum, tempNum, currentRow; 
    currentRow = *((int*) pv); 
    ... 

Наконец, чтобы присоединиться к л нить заменить один вызов pthread_join() петлей:

for (i = 0; i < numberOfThreads; ++i) 
{ 
    pthread_join(tid[i], NULL); 
} 
+0

ничего себе! Это сработало! Спасибо!!! Мне пришлось указать имя параметра после (void *) – angyxpoo

+0

Очень приятный систематический ответ, ясный и полезный! – Rob11311

1

INT pthread_create (pthread_t * нить, Const pthread_attr_t * атр, void * (* start_routine) (void *), void * arg);

Третий параметр - это функция запуска, выполняющая пустоту ptr и возвращающая пустоту ptr.

Четвертый параметр принимает void ptr, указывающий на данные, которые вы хотите передать, в этом случае threadcnt.

+0

Я пытаюсь понять, как изменить свою строку кода, чтобы соответствовать этому. Для 1-го параметра я бы использовал & tid, для второго параметра я бы использовал & attr, для третьего параметра я бы использовал void (* matrixCalc) (void *)? Или & matrixCalc? Я получаю ошибки с тем, что я пытаюсь использовать. и я попытался создать указатель, чтобы указать на мой threadCount, но я получаю сообщение об ошибке. я бы просто сделал & threadCount – angyxpoo

+0

Извините, это напряженный день. См. Ответ алка. Похоже, он почти полностью покрыт. FWIW мы должны иметь FAQ по этому вопросу. По крайней мере, третий вопрос «pthread», похоже, касается именно этого. – Duck

+0

да! Алек помог мне! спасибо – angyxpoo