Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> глюки с потоком - ошибка сегментирования 
:(
    Опции темы
kosmonaFFFt
Дата 12.10.2008, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: 1
Всего: 5



Доброго всем времени суток.
Имеется прога -
Код

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

//Структура, содержащая указатели на номер числа фибоначчи и результат.
typedef struct FIBONACCI_T {
    int * number;
    int * result;
} FIBONACCI;

//Прототип ф-и потока.
void * evaluate_fib(void * param);

int main(int argc, char** argv) {
    
    //Поток.
    pthread_t fib_thread;
    //Параметры потока.
    pthread_attr_t fib_thread_attr;
    //Запуск потока.
    pthread_create(&fib_thread, &fib_thread_attr, evaluate_fib, NULL);
    //Завершение ожидания потока.
    pthread_join(fib_thread, NULL);

    return (EXIT_SUCCESS);
}

//Функция потока.
void * evaluate_fib(void * param) {
    pthread_exit(NULL);
    //FIBONACCI * fib = (FIBONACCI *)param;
    //printf("Hello, world!!!");
}


(недописанная еще, но уже не работает)
так вот проблема - при запуске все время выдает ошибку сегментирования.
Код

/home/anton/apps/netbeans-6.0.1/cnd1/bin/dorun.sh: line 82:  6174 Ошибка сегментирования                   "$pgm" "$@"


хотя есть почти такая же прога -
Код

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

//Структура с матрицами, дабы передать их в качестве одного параметра в функцию можно было.
typedef struct MATRIXS_T {
    float * * first_matrix;
    float * * second_matrix;
    float * * result;
    int size;
} MATRIXS;

//Прототипы функций потоков.
void * multiply_matrixs(void * param);
void * addition_matrixs(void * param);

int main(int argc, char** argv) {
    //Запрос размерности матриц.
    printf("Vvedite razmernost\' matric:\n");
    //Матрицы, в структуру инкапсулированные.
    MATRIXS matrixs;
    //Считывание размера.
    scanf("%d", &(matrixs.size));
    //Выделение памяти.
    matrixs.first_matrix = (float * *)malloc(matrixs.size * sizeof(float *));
    matrixs.second_matrix = (float * *)malloc(matrixs.size * sizeof(float *));
    matrixs.result = (float * *)malloc(matrixs.size * sizeof(float *));
    int line_number;
    for (line_number = 0; line_number < matrixs.size; ++line_number) {
        matrixs.first_matrix[line_number] = (float *)malloc(matrixs.size * sizeof(float));
        matrixs.second_matrix[line_number] = (float *)malloc(matrixs.size * sizeof(float));
        matrixs.result[line_number] = (float *)malloc(matrixs.size * sizeof(float));
    }
    //Ввод матриц.
    printf("Vvedite pervuyu matricu:\n");
    int column_number;
    for (line_number = 0; line_number < matrixs.size; ++line_number) {
        for (column_number = 0; column_number < matrixs.size; ++column_number) {
            scanf("%f", matrixs.first_matrix[line_number] + column_number);
        }
    }
    printf("Vvedite vtoruyu matricu:\n");
    for (line_number = 0; line_number < matrixs.size; ++line_number) {
        for (column_number = 0; column_number < matrixs.size; ++column_number) {
            scanf("%f", matrixs.second_matrix[line_number] + column_number);
        }
    }
    //Потоки.
    pthread_t addition_thread;
    pthread_t multiplication_thread;
    //Структура с параметрами потоков.
    pthread_attr_t threads_attribs;
    //Сложение матриц.
    pthread_create(&addition_thread, &threads_attribs, addition_matrixs, &matrixs);
    //Ожидание завершения потока.
    pthread_join(addition_thread, NULL);

    //Вывод результата сложения.
    printf("Rezul\'tat slojeniya:\n");
    for (line_number = 0; line_number < matrixs.size; ++line_number) {
        for (column_number = 0; column_number < matrixs.size; ++column_number) {
            printf("%f  ", matrixs.result[line_number][column_number]);
        }
        printf("\n");
    }
    //Умножение матриц.
    pthread_create(&multiplication_thread, &threads_attribs, multiply_matrixs, &matrixs);
    pthread_join(multiplication_thread, NULL);

    //Вывод результата умножения.
    printf("Rezul\'tat umnojeniya:\n");
    for (line_number = 0; line_number < matrixs.size; ++line_number) {
        for (column_number = 0; column_number < matrixs.size; ++column_number) {
            printf("%f  ", matrixs.result[line_number][column_number]);
        }
        printf("\n");
    }
    //Освобождение памяти.
    for (line_number = 0; line_number < matrixs.size; ++line_number) {
        free(matrixs.first_matrix[line_number]);
        free(matrixs.second_matrix[line_number]);
        free(matrixs.result[line_number]);
    }
    free(matrixs.first_matrix);
    free(matrixs.second_matrix);
    free(matrixs.result);
    
    return (EXIT_SUCCESS);
}

//Сложение матриц.
void * addition_matrixs(void * param) {
    MATRIXS * matrixs = (MATRIXS *)param;
    int line_number;
    int column_number;
    for (line_number = 0; line_number < matrixs->size; ++line_number) {
        for (column_number = 0; column_number < matrixs->size; ++column_number) {
            matrixs->result[line_number][column_number] = matrixs->first_matrix[line_number][column_number] + 
                    matrixs->second_matrix[line_number][column_number];
        }
    }
}

//Умножение матриц.
void * multiply_matrixs(void * param) {
    MATRIXS * matrixs = (MATRIXS *)param;
    int line_number;
    int column_number;
    int index;
    for (line_number = 0; line_number < matrixs->size; ++line_number) {
        for (column_number = 0; column_number < matrixs->size; ++column_number) {
            matrixs->result[line_number][column_number] = 0;
            for (index = 0; index < matrixs->size; ++index) {
                matrixs->result[line_number][column_number] += matrixs->first_matrix[line_number][index] *
                        matrixs->second_matrix[index][column_number];
            }
        }
    }
}


которая работает прекрасно и никакой ошибки не пишет.
Рабочая прога написана за 2 дня до начала попыток написания нерабочей.

Если кто знает в чем может быть проблема - жду помощи.

З.Ы. Обе проги писаны в NetBeans под Debian lenny с опцией коммандной строки -lpthread


Это сообщение отредактировал(а) kosmonaFFFt - 12.10.2008, 20:35


--------------------
user posted image
PM MAIL ICQ   Вверх
MAKCim
Дата 12.10.2008, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



kosmonaFFFt
а в gdb нельзя посмотреть core файл?  smile 

первое, что бросилось в глаза - не инициализированная структура pthread_attr_t в обоих случаях


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
gmorgunov
Дата 13.10.2008, 03:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 17.5.2008

Репутация: нет
Всего: 5



kosmonaFFFt

Вот так все работает. А с синхронизацией вы уж сами  smile 

Код

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
//Структура, содержащая указатели на номер числа фибоначчи и результат.
typedef struct FIBONACCI_T {
    int * number;
    int * result;
} FIBONACCI;
//Прототип ф-и потока.
void * evaluate_fib(void * param);

int main(int argc, char** argv) {
   
    FIBONACCI fibonacci; // аргументы для evaluate_fib        
    
    //Поток.
    pthread_t fib_thread;
    
    //Запуск потока.
    pthread_create(&fib_thread, NULL,evaluate_fib,&fibonacci);
    sleep (1);
    printf("goodbye \n");
    return 0;
}
//Функция потока.
void * evaluate_fib(void * param) {
     printf("hello \n");
     return 0;
}


PM MAIL   Вверх
kosmonaFFFt
Дата 13.10.2008, 08:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: 1
Всего: 5



Спс. Заменил адрес струтуры с параметрами потока на NULL и все заработало.


--------------------
user posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.1016 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.