Доброго всем времени суток. Имеется прога - Код | #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
|