Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Многопоточность в Linux

34K
24 октября 2009 года
muturgan
96 / / 01.10.2009
У меня есть такое задание. С клавиатуры вводятся 2 числа m и n. Мне нужно создать матрицу целых чисел размера mxn, после чего главный поток создает m потоков, в которые передает адрес i-ой строки матрицы (в первый поток адрес первой строки, во второй адрес второй и т.д.) и n – число столбцов матрицы. Функция потока вычисляет сумму элементов строки и возвращает вычисленное значение. Главный поток вычисляет сумму полученных из потоков значений и печатает ее.

Вся проблема у меня с созданием потоков. Вот какой код у меня получился, подскажите что делать дальше

Код:
#include <iostream>
using std::cout;
using std::cin;

int main(int argc, char** argv)
{
    int m,n;
    cout<<"Введите число m: ";
    cin>>m;
    cout<<"Введите число n: ";
    cin>>n;

//--------------------------------------------------------------------------
// Выделим память для матрицы размера mxn
//--------------------------------------------------------------------------
    int** matrix = 0;
    matrix = new int*[ m ];
    for (int i=0; i < m; i++)
        matrix = new int[ n ];

//--------------------------------------------------------------------------
// Заполним матрицу числами, равными сумме номера строки и номера столбца
//--------------------------------------------------------------------------
    for (int i = 0; i < m; i++)
    {
        for (int j=0; j < n; j++)
            matrix[j]=i+j;
    }


P.S. Это самый хитрый способ, какой я видел, для вычисления суммы элементов матрицы. =)
34K
25 октября 2009 года
muturgan
96 / / 01.10.2009
Почти доделал сам, вот получившийся код:
Код:
#include <iostream>
#include <stdlib.h>
#include <pthread.h>
using std::cout;
using std::cin;
using std::string;

struct param // Cтруктура, содержащая в себе параметры, передаваемые в функцию
{
    int sum_;
    int n_;
    int* m_;
};

//-------------------------------------------------------------------------------------------------
// Опишем функцию, которая будет передаваться в потоки
//-------------------------------------------------------------------------------------------------
void* func( void* parameter)
{
    int sum = 0;
    for (int i = 0; i < reinterpret_cast<param*>(parameter)->n_; i++)
        sum += reinterpret_cast<param *>(parameter)->m_;
    cout << sum <<"\n";
    reinterpret_cast<param *>(parameter)->sum_ = sum; // Полю sum_ структурной переменной parameter присвоим значение суммы столбцов
    return 0;
}

int main(int argc, char** argv)
{
    string str, stol;
    cout<<"Введите число m: ";
    cin>>str;
    cout<<"Введите число n: ";
    cin>>stol;

    int m = atoi( str.c_str() );
    int n = atoi( stol.c_str() );
//-------------------------------------------------------------------------------------------------
// Выделим память для матрицы размера mxn
//-------------------------------------------------------------------------------------------------
    int** matrix = 0;
    matrix = new int*[ m ];
    for (int i=0; i < m; i++)
        matrix = new int[ n ];
//-------------------------------------------------------------------------------------------------
// Заполним матрицу числами, равными сумме номера строки и номера столбца
//-------------------------------------------------------------------------------------------------
    for (int i = 0; i < m; i++)
    {
        for (int j=0; j < n; j++)
            matrix[j]=i+j;
    }

//-------------------------------------------------------------------------------------------------
// Выведем матрицу на экран
//-------------------------------------------------------------------------------------------------
    for (int i = 0; i < m; i++)
    {
        for (int j=0; j < n; j++)
            cout << matrix[j]<<"\t";
        cout << "\n";
    }
//-------------------------------------------------------------------------------------------------
// Создадим массив структур, которые будут переданы в качестве параметров в потоки
//-------------------------------------------------------------------------------------------------
    param* parameters = new param[ m ];
    for ( int i=0; i < m; i++ )
    {
        parameters[ i ].n_ = n;
        parameters[ i ].m_ = matrix;
    }
//-------------------------------------------------------------------------------------------------
// Создадим массив, который будет содежать в себе id потоков
//-------------------------------------------------------------------------------------------------
    pthread_t* id_array = new pthread_t[ m ];
//-------------------------------------------------------------------------------------------------
// Создадим m потоков, передав потокам параметры в структуре
//-------------------------------------------------------------------------------------------------
    for ( int i=0; i < m; i++ )
        pthread_create( &id_array, 0, func, (void*)&parameters );
//-------------------------------------------------------------------------------------------------
// Освободим память, выделенную под матрицу и параметры и массив, содержащий id потоков
//-------------------------------------------------------------------------------------------------
    delete [] parameters;

    delete [] id_array;

    for (int i=0; i < m; i++)
        delete [] matrix;
    delete [] matrix;
    return 0;
}


Но компилятор ругается такими словами:
/tmp/ccdetUp6.o: In function `main':
threads.cpp: (.text+0x320): undefined reference to `pthread_create'
collect2: ld returned 1 exit status

Кто в теме, помогите, пожалуйста.
260
25 октября 2009 года
Ramon
1.1K / / 16.08.2003
А компилятор ли.... Орет линкер, что надобно либу подключить ("-lpthread").

А еще вы забыли подождать окончания исполнения потоков, иначе после освобождения памяти во время работы одного из них случится "страшное".
34K
25 октября 2009 года
muturgan
96 / / 01.10.2009
Цитата: Ramon
А компилятор ли.... Орет линкер, что надобно либу подключить ("-lpthread").

А еще вы забыли подождать окончания исполнения потоков, иначе после освобождения памяти во время работы одного из них случится "страшное".



Да, спасибо, сейчас всё заработало.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог