Студопедия

Главная страница Случайная лекция


Мы поможем в написании ваших работ!

Порталы:

БиологияВойнаГеографияИнформатикаИскусствоИсторияКультураЛингвистикаМатематикаМедицинаОхрана трудаПолитикаПравоПсихологияРелигияТехникаФизикаФилософияЭкономика



Мы поможем в написании ваших работ!




МЕТОДИКА ВЫПОЛНЕНИЯ

1. Ознакомиться с приведенным текстом приложения, в котором создаются 2 потока одного процесса, выполняющиеся с критическими секциями.

Приложение использует 1 Button, 2 ListBox , 1 CheckBox. При установке (включении) критических секций конечным результатом работы приложения должно быть значение глобальной переменной, равное 124.

 

Ввиду нереентерабельности библиотеки VCL Delphi приведенное ниже приложение категорически НЕ ПРЕДНАЗНАЧЕНО для выполнения на CPU с поддержкой гипертрединга, а также на двухядерных процессорах.Теоретически можно попробовать отключить один процессор с помощью диспетчера задач.

unit Critsec;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls;

type

TForm1 = class(TForm)

Button1: TButton; ListBox1: TListBox; ListBox2: TListBox;

CheckBox1: TCheckBox;

procedure FormCreate(Sender: TObject);

procedure FormDestroy(Sender: TObject);

procedure Button1Click(Sender: TObject);

end;

var

Form1 : TForm1;

crits : boolean;

sect1 : TRTLCriticalSection;

global: word;

// 2 // hmut : thandle;

implementation

{$R *.DFM}

// инициализация объекта синхронизации

procedure TForm1.FormCreate(Sender: TObject);

begin

initializeCriticalSection(sect1);

// 2 // hmut := createmutex(nil,false,nil);

end;

// удаление объекта синхронизации

procedure TForm1.FormDestroy(Sender: TObject);

begin

DeleteCriticalSection(sect1);

//2// closehandle(hmut);

end;

// функция первого потока

function Thr1 (p:pointer):longint; stdcall;

var i,j : integer;

begin

form1.listbox1.items.clear;

for j:=1 to 12 do

begin

if crits then

EnterCriticalSection (sect1);

//2// waitforsingleobject(hmut,infinite);

// начало критического участка

sleep(1);

i:=global; i:=i+1;

form1.listbox1.items.add(intToStr(i));

global:=i;

sleep (3);

// конец критического участка

if crits then

LeaveCriticalSection(sect1);

//2// releasemutex(hmut);

end;

end;

 

// функция первого потока

function Thr2 (p:pointer):longint; stdcall;

var i,j : integer;

begin

form1.listbox2.items.clear;

for j:=1 to 12 do

begin

if crits then

EnterCriticalSection (sect1);

//2// waitforsingleobject(hmut,infinite);

// начало критического участка

sleep(2);

i:=global; i:=i+1;

form1.listbox2.items.add(intToStr(i));

global:=i;

sleep (3);

// конец критического участка

if crits then

LeaveCriticalSection(sect1);

//2// releasemutex(hmut);

end;

end;

 

procedure TForm1.Button1Click(Sender: TObject);

var thrid : dword;

thrh1,thrh2: thandle;

begin

global:= 100;

if CheckBox1.Checked then crits:= true

else crits:= false ;

// создание и запуск потоков

thrh1:=CreateThread(nil,0,@Thr1,nil,0,thrid);

thrh2:=CreateThread(nil,0,@Thr2,nil,0,thrid);

end;

end.

 

Для исправления указанного недостатка можно использовать два способа:

· направить вывод потоков в два буфера, содержимое буферов выводить после завершения работы потоков Thrh1 и Thrh2 в основном потоке;

· при обращении потоков к VCL использовать средства синхронизации доступа.

Рекомендуется использовать первый способ. Для этого необходимо:

· описать два массива целых чисел, состоящих из 12 элементов;

· заменить запись чисел в ListBox1 и ListBox2 записью в массивы;

· после оператора thrh2:=CreateThread(nil,0,@Thr2,nil,0,thrid); дождавшись окончания работы потоков Thrh1 и Thrh2 вывести содержимое массивов соответственно в ListBox1 и ListBox2.

Дождаться окончания работы потоков Thrh1 и Thrh2 можно тремя способами:

1. Поставить задержку (sleep) на N Мсек.

2. Использовать синхронизацию с помощью WaitForSingleObject (Thrh, infinite), имея в виду, что объект Поток занят, пока поток выполняется и переходит в свободное состояние при завершении потока.

3. Использовать синхронизацию с помощью WaitForMultipleObjects (2, @arthr, True, infinite); в которой аргумент arthr – массив, состоящий из хэндлов потоков Thrh1 и Thrh2.

Оценить достоинства и недостатки каждого из трех способов ожидания окончания работы потоков.

Проверить работу средства синхронизации доступа потоков к критическому участку – критической секции. Ожидание завершения работы потоков выполнять с помощью функции

WaitForMultipleObjects ().

 

2. Проверить работу мьютекса. Снять символы комментариев, поставить их на операторах использования критических секций и запустить приложение сначала с критическими секциями (вместо них теперь используется мьютекс), а затем без них.

 

3. Добавить в один из потоков разработанных в п.1 приложений оператор, завершающий выполнение одного из потоков после прохождения 5 циклов. Выполнить приложения, отследить поведение второго потока приложений.

 

4. Переписать разработанные приложения с использованием семафоров и событий с автоматическим сбросом и проверить правильность их работы.

 

5. Добавить в один из потоков разработанных приложений оператор, завершающий выполнение одного из потоков после прохождения 5 циклов. При этом синхронизирующий объект НЕ ДОЛЖЕН освобождаться. Выполнить приложения, отследить поведение второго потока приложений.

 

6. Разработать приложение с двумя потоками, попадающими в тупик в процессе выполнения. Для синхронизации потоков следует использовать два семафора S1 и S2 с начальными значениями, равными 1. Первый поток через T1 Мс после начала выполнения должен занять первый семафор – операция P(S1), функция WaitForSingleObject (S1, infinite), а второй поток через T2 Мс после начала выполнения – второй семафор - операция P(S2), функция WaitForSingleObject (S2, infinite).

Спустя T3 Мс первый поток должен занять второй семафор - операция P(S2), а второй поток через T4 Мс занять первый семафор – операция P(S1). Затем каждый поток должен освободить занятые семафоры – операции V(S1) и V(S2), функции ReleaseSemaphore().

Значения T1-T4 должны задаваться путем ввода с клавиатуры. Выполнение каждой операции должно протоколироваться с помощью вывода соответствующего сообщения в ListBox.

7. Проверить работу приложения при многократном запуске с различными значениями параметров T1-T4.

 


<== предыдущая страница | следующая страница ==>
КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ. Цель работы - практическое знакомство с методами синхронизации двух потоков одного процесса с помощью критических секций | ОТЧЕТ О РАБОТЕ

Дата добавления: 2015-07-26; просмотров: 189; Нарушение авторских прав




Мы поможем в написании ваших работ!
lektsiopedia.org - Лекциопедия - 2013 год. | Страница сгенерирована за: 0.004 сек.