Основы параллельного программирования
скачать (85.6 kb.)
Доступные файлы (5):
lab1.doc | 109kb. | 08.09.2005 00:59 | ![]() |
lab2.doc | 27kb. | 29.09.2005 13:06 | ![]() |
lab3.doc | 75kb. | 27.10.2005 14:09 | ![]() |
lab4!.doc | 52kb. | 29.10.2007 00:24 | ![]() |
Lab5.doc | 173kb. | 12.11.2006 23:56 | ![]() |
содержание
- Смотрите также:
- Теоретические основы параллельного программирования [ документ ]
- Малышкин В.Э. Основы параллельных вычислений. Часть 1 [ документ ]
- Богачёв К.Ю. Основы параллельного программирования [ документ ]
- Лабутина А.А. Учебный курс Введение в методы параллельного программирования: Сортировка данных [ документ ]
- Городняя Л.B. Основы функционального программирования [ документ ]
- Букатов А.А., Дацюк В.Н., Жегуло А.И. Программирование многопроцессорных вычислительных систем [ документ ]
- Немнюгин С.А. Средства программирования для многопроцессорных вычислительных систем [ документ ]
- Вальковский В.А., Котов В.Е., Марчук А.Г., Миренков Н.Н. Элементы параллельного программирования [ документ ]
- Шпаргалки по информатике [ шпаргалка ]
- Java course. Часть 2 [ документ ]
- Высокоуровневые методы информатики и программирования (ВМИП) [ документ ]
- Антонов А.С. Параллельное программирование с использованием технологии MPI [ документ ]
lab1.doc
Лабораторная работа №1Потоки в Windows
Для создания многопоточных приложений в среде программирования C++Builder используется абстрактный класс TThread, позволяющий создавать отдельные потоки процесса. Для этого необходимо создать потомка класса TThread, каждый новый потомок является новым потоком.
При организации многопоточных приложений следует придерживаться следующих правил:
не следует организовывать слишком много потоков, рекомендуемый предел – 16 потоков на один процесс на однопроцессорном компьютере,
когда несколько потоков используют общий ресурс, они должны синхронизироваться для избежания конфликтов.
Целью данной лабораторной работы является изучение свойств, методов и событий класса TThread для написания простых многопоточных приложений. Для повышения наглядности работы, потоки будут напрямую обращаться к свойствам и методам компонентов библиотеки VCL - меткам (Label), индикаторам процесса выполнения (ProgressBar) и кнопкам., что, вообще, не допустимо из за потенциальной возможности возникновения проблемам синхронизации доступа. Однако, учитывая учебный характер данных программ и минимальную вероятность одновременного использования ресурсов, мы сделаем допущение, что общих совместно используемых разными потоками ресурсов у нас нет и рассматривать вопросы синхронизации в данной работе не будем.
^ СВОЙСТВА (PROPERTIES) | |
FreeOnTerminate | |
Вид: | __property bool FreeOnTerminate = {read=FFreeOnTerminate, write=FFreeOnTerminate, nodefault}; |
Опис.: | Определяет, уничтожится ли автоматически объект потока при завершении потока. Если FreeOnTerminate = истина, то объект уничтожается автоматически, в противном случае его необходимо уничтожать явно (delete). |
Прим.: | void __fastcall TtestThread::Execute(){ int Result FreeOnTerminate=true; for(int i=0; i<10000; i++) Result+=sin(i); } |
Handle | |
Вид: | __property int Handle = {read=FHandle, nodefault}; |
Опис.: | Возвращает дескриптор потока. Необходим при использовании WinAPI функций. |
Прим.: | P1->Resume(); int HT=P1->Handle; Form1->Label2->Caption = IntToStr(HT); |
Priority | |
Вид: | enum TThreadPriority {tpIdle, tpLowest, tpLower, tpNormal, tpHigher, tpHighest, tpTimeCritical}; __property TThreadPriority Priority = {read=GetPriority, write=SetPriority, nodefault}; |
Опис.: | Определяет относительный приоритет потока. |
Прим.: | P1 = new IvanovP1(true); ^ P1->Resume(); |
Suspended | |
Вид: | __property bool Suspended = {read=FSuspended, write=SetSuspended, nodefault}; |
Опис.: | Определение состояния, а также приостановка/продолжение выполнения потока. Если Suspended = true – поток приостанавливается. На false – продолжение выполнения. |
Прим.: | first->Suspended=true; //Остановка выполнения потока ... first->Suspended=false; //Продолжение выполнения потока |
Terminated | |
Вид: | __property bool Terminated = {read=FTerminated, nodefault}; |
Опис.: | Определяет, был ли завершен поток. Метод Execute должен периодически проверять Terminated, и выходить, если Terminated = true. Метод Terminate устанавливает Terminated в true. |
Прим.: | void __fastcall TMyThread::Execute() { while (!Terminated){ … } } |
ThreadID | |
Вид: | __property int ThreadID = {read=FThreadID, nodefault}; |
Опис.: | Получение идентификатора потока. |
Прим.: | int id=first->ThreadID; |
^ | |
DoTerminate | |
Вид: | virtual void __fastcall DoTerminate(void); |
Опис.: | Генерирует событие OnTerminate, но не завершает поток. |
Execute | |
Вид: | virtual void __fastcall Execute(void) = 0; |
Опис.: | Чистый виртуальный метод. Содержит исполняемый код потока. |
Прим.: | void __fastcall IvanovP1::Execute() { float s = 0; for(int i=0;i<N;i++){ s+= sin(i) + cos(i); Form1->ProgressBar1->Position = i; if(Terminated) return; } } |
Resume | |
Вид: | void __fastcall Resume(void); |
Опис.: | Выполнение или возобновление выполнения прерванного потока. |
Прим.: | first->Resume(); |
Suspend | |
Вид: | void __fastcall Suspend(void); |
Опис.: | Приостановка выполнения потока. |
Прим.: | first->Suspend(); |
Synchronize | |
Вид: | typedef void __fastcall (__closure *TThreadMethod)(void); void __fastcall Synchronize(TThreadMethod &Method); |
Опис.: | Выполняет вызов метода в пределах основного потока VCL. Параметр Method имеет тип TThreadMethod (означающий процедурный метод, не использующий никаких параметров). Метод, передаваемый в качестве параметра Method, и является как раз тем методом, который затем выполняется из основного потока приложения. Synchronize используется для устранения многопоточных конфликтов. Если нет уверенности, что какой-то метод является потоко-безопасным, его следует запускать в пределах главного VCL потока посредством передачи в Synchronize. |
Прим.: | void __fastcall TMyThread::PushTheButton(void) { Button1->Click(); } void __fastcall TMyThread::Execute() { ... Synchronize(PushTheButton); ... } |
Terminate | |
Вид: | void __fastcall Terminate(void); |
Опис.: | Устанавливает свойство Terminated в истину, сигнализируя, что поток должен завершиться быстро, как только это возможно. В отличие от WinAPI функции TerminateThread, которая вынуждает поток завершиться, Terminate просто сигнализирует о необходимости завершения. |
Прим.: | void __fastcall IvanovP1::Execute() { float s = 0; for(int i=0;i<N;i++){ s+= sin(i) + cos(i); Form1->ProgressBar1->Position = i; if(Terminated)goto a1; } a1:; Fa = s; } //---------- void __fastcall TForm1::Button5Click(TObject *Sender) { P1->Terminate(); } |
TThread | |
Вид: | __fastcall TThread(bool CreateSuspended); |
Опис.: | Конструктор. Создает образец объекта потока. Если CreateSuspended - false, метод Execute будет вызван немедленно, в противном случае поток будет создан в приостановленном состоянии и для его запуска необходимо вызвать метод Resume. |
Прим.: | TMyThread *Second = new TMyThread(true); // создать, но не запускать Second->Priority = tpLower; // установка приоритета ниже нормального Second->Resume(); // запуск потока |
WaitFor | |
Вид: | int __fastcall WaitFor(void); |
Опис.: | Ожидание завершения потока. |
Прим.: | ... first->Resume(); first->WaitFor(); second->Resume(); ... В данном примере два потока first и second будут выполняться последовательно. Поток second начнет выполняться только по завершении выполнения потока first. |
^ | |
OnTerminate | |
Вид: | __property TNotifyEvent OnTerminate = {read=FOnTerminate, write=FOnTerminate}; |
Опис.: | Событие происходит после выхода из метода Execute но прежде, чем поток будет уничтожен. |
Прим.: | P1->OnTerminate = ThreadDone; |
1) Разработать программу для вычисления определенного интеграла от заданной функции на заданном отрезке методом прямоугольников. Программа должна разбивать отрезок на три равные части, запускать по выбору вычисления на каждом отрезке по 10000 значений либо параллельно, либо последовательно, обеспечивать приостановку и прерывание вычислений, установку приоритета каждого потока, по окончании вычислений сложить их результаты и получить ответ.
-
Вариант
Функция
Отрезок
1
sin(x)*cos(x2)
[0, 10]
2
ln(x)+10*cos(x)
[0, 8]
3
x2-10*x+sin(x)
[3, 9]
4
2x / x3
[4, 10]
5
15*cos(2*x)/ln(x)
[2, 8]
6
ln(x)-2*sin(3*x)
[3, 10]
7
2x – lg(x)
[1, 3]
8
3*x3/sin(x)
[0, 6]
9
xx – 10*sin(5*x)
[1, 4]
2) Разработать программу для сравнения эффективности двух заданных алгоритмов сортировки путем их одновременного запуска на случайном массиве из 50000 целых чисел. Обеспечить вывод отсортированной последовательности в файл. Программа должна отображать ход вычислений, допускать приостановку и прерывания вычислений.
-
Вариант
Алгоритм 1
Алгоритм 2
1
Быстрая
Обменами (пузырек)
2
Пирамидальная
Вставками
3
Слиянием
Быстрая
4
Выбором
Пирамидальная
5
Быстрая
Вставками
6
Слиянием
Обменами (пузырек)
7
Пирамидальная
Выбором
8
Обменами
Пирамидальная
9
Слиянием
Вставками
Скачать файл (85.6 kb.)