Logo GenDocs.ru

Поиск по сайту:  

Загрузка...

Основы параллельного программирования - файл lab1.doc


Основы параллельного программирования
скачать (85.6 kb.)

Доступные файлы (5):

lab1.doc109kb.08.09.2005 00:59скачать
lab2.doc27kb.29.09.2005 13:06скачать
lab3.doc75kb.27.10.2005 14:09скачать
lab4!.doc52kb.29.10.2007 00:24скачать
Lab5.doc173kb.12.11.2006 23:56скачать

содержание

lab1.doc

Лабораторная работа №1

Потоки в Windows
Для создания многопоточных приложений в среде программирования C++Builder используется абстрактный класс TThread, позволяющий создавать отдельные потоки процесса. Для этого необходимо создать потомка класса TThread, каждый новый потомок является новым потоком.

При организации многопоточных приложений следует придерживаться следующих правил:

  • не следует организовывать слишком много потоков, рекомендуемый предел – 16 потоков на один процесс на однопроцессорном компьютере,

  • когда несколько потоков используют общий ресурс, они должны синхронизироваться для избежания конфликтов.
Целью данной лабораторной работы является изучение свойств, методов и событий класса TThread для написания простых многопоточных приложений. Для повышения наглядности работы, потоки будут напрямую обращаться к свойствам и методам компонентов библиотеки VCL - меткам (Label), индикаторам процесса выполнения (ProgressBar) и кнопкам., что, вообще, не допустимо из за потенциальной возможности возникновения проблемам синхронизации доступа. Однако, учитывая учебный характер данных программ и минимальную вероятность одновременного использования ресурсов, мы сделаем допущение, что общих совместно используемых разными потоками ресурсов у нас нет и рассматривать вопросы синхронизации в данной работе не будем.
^
1. КЛАСС TTHREAD




СВОЙСТВА (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->Priority = tpNormal;

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;

^ МЕТОДЫ (METHODS)

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.

^ СОБЫТИЯ (EVENTS)

OnTerminate

Вид:

__property TNotifyEvent OnTerminate = {read=FOnTerminate, write=FOnTerminate};

Опис.:

Событие происходит после выхода из метода Execute но прежде, чем поток будет уничтожен.

Прим.:

P1->OnTerminate = ThreadDone;
^
2. ЗАДАНИЕ К ЛАБОРАТОРНОЙ РАБОТЕ № 1
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.)

Поиск по сайту:  

© gendocs.ru
При копировании укажите ссылку.
обратиться к администрации