Lab_1TPx

advertisement
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
«Владимирский государственный университет
имени Александра Григорьевича и Николая Григорьевича Столетовых»
(ВлГУ)
Кафедра «Вычислительная техника»
Лабораторная работа № 1
по дисциплине:
«Технология программирования»
Создание потоков
Выполнил:
ст. гр. ВТ-111
Петухов С.П.
Принял:
В.А. Барков
Владимир 2013
Цель работы:
Изучить потоки и способы их создания с использованием
библиотеки windows.h.
1. Составить две многопоточные программы:
1. IntgSin.cpp - для приближенного вычисления интеграла от sin(x) в
пределах от 0 до Pi методом прямоугольников с разбиением
интервала интегрирования на n отрезков (n = 100000000).
2. PrimeCnt.cpp - для опредения количества простых чисел в диапазоне
0..n (n = 100000000).
2. Исследовать зависимость времени выполнения программ от числа потоков
выполнения.
Решение задачи №1:
#include "stdafx.h"
#include <iostream>
#include "math.h"
#include <windows.h>
#define pi 3.141592
using namespace std;
HANDLE *hObj;
DWORD *ID;
const double h = pi/100000000; //шаг
double dl;//длина отрезка
int kolvo;
double *res;
DWORD WINAPI Fn (PVOID p) {
double x0=dl*((int)p);
double x1=x0 + dl;
for (double x=x0; x<x1; x=x+h)
res[(int)p]=res[(int)p] + sin(x)*h;
return 0;
};
int main () {
double result=0;
cout<<"Quantity of threads: ";
cin>>kolvo;
cout<<endl;
hObj=new HANDLE[kolvo];
ID=new DWORD[kolvo];
res=new double[kolvo];
dl=pi/kolvo;
int t0=GetTickCount();
for (int i=0; i<kolvo; i++) {
res[i]=0;
hObj[i]= CreateThread (NULL, 0, Fn, (PVOID)i, 0, &ID[i]);
}
WaitForMultipleObjects(kolvo, hObj, TRUE, INFINITE);
int t=GetTickCount() - t0;
for (int i=0; i<kolvo; i++) {
result=result + res[i];
CloseHandle(hObj[i]);
}
delete[] hObj;
delete[] ID;
delete[] res;
//результат
printf("Result: %.10f\n", result);
cout<<"Time: "<<t<<"msec"<<endl;
system("pause");
return 0;
}
Скриншоты выполнения работы программы:
Результаты работы программы и экспериментов с количеством потоков:
Количество потоков
Время выполнения
Полученный результат
1
1,903 секунд
1,9999999960
2
0,999 секунд
1,9999999971
3
1,155 секунд
2,0000000345
4
1,061 секунд
2,0000000209
5
1,139 секунд
2,0000000174
6
0,905 секунд
2,0000000383
7
0,842 секунд
2,0000000976
8
0,780 секунд
2,0000000336
Как видно, наименьшее время, затрачиваемое на выполнение программы
на данной машине, достигается при количестве потоков, равным 8.
Решение задачи №2:
#include
#include
#include
#include
"stdafx.h"
<iostream>
<windows.h>
"math.h"
using namespace std;
HANDLE *hObj;
DWORD *ID;
int razm;// интервал чисел в потоке
int n=100000000;
int kolvo;
int *res;
DWORD WINAPI PrimeCnt (PVOID p) {
bool f;
int x0=razm*((int)p);
int x1=x0 + razm;
if((int)p==0) x0=x0+2;
//просматриваем числа от х0 до х1
for(int i=x0; i<x1; i++){
f=true;
//просматриваем числа от 2 до текущего
for (int j=2; (j*j)<=i; j++)
if(i%j==0) {f=false; break;};//проверка есть ли делители
if(f==true) res[(int)p]++;
}
return 0;
}
int main() {
int result=0;
cout<<"Quantity of threads: ";
cin>>kolvo;
cout<<endl;
hObj=new HANDLE[kolvo];
ID=new DWORD[kolvo];
res=new int[kolvo];
razm=n/kolvo;
int t0=GetTickCount();
for (int i=0; i<kolvo; i++) {
res[i]=0;
hObj[i] = CreateThread(NULL, 0, PrimeCnt, (PVOID)i, 0, &ID[i]);
}
WaitForMultipleObjects(kolvo, hObj, TRUE, INFINITE);
int t=GetTickCount() - t0;
for(int i=0; i<kolvo; i++){
result=result + res[i];
CloseHandle(hObj[i]);
}
delete[] hObj;
delete[] ID;
delete[] res;
cout<<"Result: "<<result<<endl;
cout<<"Time: "<<t<<"msec"<<endl;
system("pause");
return 0;
}
Скриншоты выполнения работы программы:
Результаты работы программы и экспериментов с количеством потоков:
Количество потоков
Время выполнения
Полученный результат
1
186,889 секунд
5761455
2
117,141 секунд
5761455
3
84,444 секунд
5761455
4
73,570 секунд
5761455
5
73,570 секунд
5761455
6
57,065 секунд
5761455
7
54,569 секунд
5761455
8
52,166 секунд
5761455
64
46,832 секунд
5761455
Спустя некоторое время количество потоков становится равным заданному.
Как видно, при большем количестве потоков на данной машине, счет идет
быстрее.
Данные программы выполнялись на компьютере с характеристиками:
 CPU: Intel® Core™ i7-2600K;
 RAM: 8GB DDR3-1333;
 OS: MS Windows 7 SP1;
Выводы: В ходе лабораторной работы были написаны две многопоточные
программы. Сравнив время выполнения программ (при создании разного
количества потоков) можно сделать вывод, что при увеличении количества
потоков, уменьшается время выполнения программы.
Download