#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;
}
Многопоточность в Linux
Вся проблема у меня с созданием потоков. Вот какой код у меня получился, подскажите что делать дальше
Код:
P.S. Это самый хитрый способ, какой я видел, для вычисления суммы элементов матрицы. =)
Код:
#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*)¶meters );
//-------------------------------------------------------------------------------------------------
// Освободим память, выделенную под матрицу и параметры и массив, содержащий id потоков
//-------------------------------------------------------------------------------------------------
delete [] parameters;
delete [] id_array;
for (int i=0; i < m; i++)
delete [] matrix;
delete [] matrix;
return 0;
}
#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*)¶meters );
//-------------------------------------------------------------------------------------------------
// Освободим память, выделенную под матрицу и параметры и массив, содержащий 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
Кто в теме, помогите, пожалуйста.
А еще вы забыли подождать окончания исполнения потоков, иначе после освобождения памяти во время работы одного из них случится "страшное".
Цитата: Ramon
А компилятор ли.... Орет линкер, что надобно либу подключить ("-lpthread").
А еще вы забыли подождать окончания исполнения потоков, иначе после освобождения памяти во время работы одного из них случится "страшное".
А еще вы забыли подождать окончания исполнения потоков, иначе после освобождения памяти во время работы одного из них случится "страшное".
Да, спасибо, сейчас всё заработало.