Министерство образования и науки Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «Владимирский государственный университет имени Александра Григорьевича и Николая Григорьевича Столетовых» (ВлГУ) Кафедра «Вычислительная техника» Лабораторная работа № 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; Выводы: В ходе лабораторной работы были написаны две многопоточные программы. Сравнив время выполнения программ (при создании разного количества потоков) можно сделать вывод, что при увеличении количества потоков, уменьшается время выполнения программы.