Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2012, 13:31   #1
maksum1990
Новичок
Джуниор
 
Регистрация: 08.12.2012
Сообщений: 1
По умолчанию С++ потоки паралельные pthread

Помогите пожалуйста переделать С консольного в С формами, я изучал только С++ консоль, а C++ form нет. Буду очень благодарен.
// paral.cpp: определяет точку входа для консольного приложения.
//
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include "windows.h"

LARGE_INTEGER b_start, b_stop, b_time, freq;

bool visual_mode = false;

int **matrixA;
int **matrixB;
int **matrixC;

int threads_count;
int matrix_size;
struct positions *pos;

struct positions{
int from;
int to;
};

void allocateMemory( int **&matrixA, int **&matrixB, int **&matrixC, struct positions *&pos, pthread_t *&threads, int matrix_size, int thread_count );
void initMatrixs( int **&matrixA, int **&matrixB, int **&matrixC, int matrix_size);
void calculateSliceMatrix( struct positions *&pos, int matrix_size, int step, int threads_count );
void* multiply(void *part_id);
void clearMultipy( int **&matrixA, int **&matrixB, int **&matrixC, int matrix_size );
void printMatrix(int **matrix);
void startInterval();
void endInterval();

int main(){

int step;

pthread_t *threads;

do{

printf("Enter threads count:");
scanf("%d", &threads_count);

} while( threads_count%4 != 0 );

do{

printf("Enter matrix size:");
scanf("%d", &matrix_size);

} while( matrix_size%4 != 0 );

step = matrix_size/threads_count;

allocateMemory( matrixA, matrixB, matrixC, pos, threads, matrix_size, threads_count );
initMatrixs( matrixA, matrixB, matrixC, matrix_size );
calculateSliceMatrix( pos, matrix_size, step, threads_count );

startInterval();

for( int i = 0; i < threads_count; i++ ){

pthread_create( &threads[i], NULL, multiply, (void *)i );
pthread_join( threads[i], NULL );

}

endInterval();

startInterval();

clearMultipy( matrixA, matrixB, matrixC, matrix_size );

endInterval();



if( visual_mode){

printMatrix(matrixA);
printf("\n");
printMatrix(matrixB);
printf("\n");
printMatrix(matrixC);

}

_getch();

}

void allocateMemory( int **&matrixA, int **&matrixB, int **&matrixC, struct positions *&pos, pthread_t *&threads, int matrix_size, int thread_count ){

matrixA = new int*[matrix_size];
matrixB = new int*[matrix_size];
matrixC = new int*[matrix_size];

pos = new struct positions[thread_count];

threads = new pthread_t[threads_count];

for ( int i = 0; i < matrix_size; i++ ){

matrixA[i] = new int[matrix_size];
matrixB[i] = new int[matrix_size];
matrixC[i] = new int[matrix_size];

}

}

void initMatrixs( int **&matrixA, int **&matrixB, int **&matrixC, int matrix_size){

srand(time(0));

for(int i = 0; i < matrix_size; i++){
for(int j = 0; j < matrix_size; j++){
matrixA[i][j] = rand()%3;
matrixB[i][j] = rand()%3;
matrixC[i][j] = 0;
}
}

}

void calculateSliceMatrix( struct positions *&pos, int matrix_size, int step, int threads_count ){

int position = 0;

for(int i = 0; i < threads_count; i++){

pos[i].from = position;
pos[i].to = position+step;
position += step;

}

}

void* multiply(void *part_id){

for( int i = pos[(int)part_id].from; i < pos[(int)part_id].to; i++){
for( int j = 0; j < matrix_size; j++){
for( int k = 0; k < matrix_size; k++ )
matrixC[i][k] += matrixA[i][j] * matrixB[j][k];
}
}

return 0;
}

void clearMultipy( int **&matrixA, int **&matrixB, int **&matrixC, int matrix_size ){

for( int i = 0; i < matrix_size; i++){
for( int j = 0; j < matrix_size; j++){
for( int k = 0; k < matrix_size; k++ )
matrixC[i][k] += matrixA[i][j] * matrixB[j][k];
}
}

}

void printMatrix(int **matrix){

for(int i = 0; i < matrix_size; i++){
for(int j = 0; j < matrix_size; j++){
printf("%3d", matrix[i][j]);
}
printf("\n");
}

}

void startInterval(){

QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&b_start);

}

void endInterval(){

QueryPerformanceCounter(&b_stop);
b_time.QuadPart = b_stop.QuadPart - b_start.QuadPart;
printf("\nTime: %lf sec.\n", (double)(b_time.QuadPart)/(double)(freq.QuadPart));

}
maksum1990 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
<pthread.h> goodbenya Общие вопросы C/C++ 1 19.06.2012 08:48
Потоки <pthread.h> RedScreenOfLife Общие вопросы C/C++ 1 27.03.2011 12:54
Проблема с socket и pthread Tahoma Qt и кроссплатформенное программирование С/С++ 1 09.03.2011 10:25
Приложения с pthread Stenly Общие вопросы C/C++ 4 18.11.2010 20:27
потоки пауэрлифтинг Общие вопросы Delphi 5 23.05.2010 14:19