Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчёт по лабораторным работам.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
398 Кб
Скачать
☆

Результат работы программы:

Ответы на контрольные вопросы:

1. В чем заключается суть проблемы синхронизации работы нитей?

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

2. Что представляет собой критическая секция?

Критическая секция – это некоторый участок кода, который в каждый момент времени может выполняться только одной из нитей.

3. Укажите состав функций, необходимых для манипулирования критическими секциями.

InitializeCriticalSection(), EnterCriticalSection(), LeaveCriticalSection(), DeleteCriticalSection().

Выполнил………………………………………………………………Погодаев А.М.

Преподаватель……………………………………………………………Мохов В.А.

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

Синхронизация задач с использованием семафоров

Цель: освоить технологию синхронизации задач с использованием семафоров в среде ОС Windows.

Оборудование: ПЭВМ IBM PC-AT 486 и выше.

Программные средства: ОС Windows (95/98/2000/, NT), Delphi 3.* (4.*, 5.*,6.*), файлы справочной документации интегрированной среды Delphi.

Задание

Разработать программу для заполнения массива несколькими задачами одновременно, выполнив синхронизацию задач с использованием механизма семафоров.

Листинг программы:

unit Unit1;

interface

uses

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

Dialogs, StdCtrls;

type

TForm1 = class(TForm)

ListBox1: TListBox;

Button1: TButton;

RadioButton1: TRadioButton;

procedure Button1Click(Sender: TObject);

private

procedure ThreadsDone(Sender:TObject);

{ Private declarations }

public

{ Public declarations }

end;

type

TFooThread = class(TTHread)

protected

procedure Execute;override;

end;

var

Form1: TForm1;

hnd: THandle;

implementation

{$R *.dfm}

const

MaxSize = 128; //Размер массива

var NextNumber:Integer = 0;

DoneFlags:Integer = 0;

GlobalArray:array[1..MaxSize] of Integer;

//увеличиваем NextNumber на 1 и возвращаем это значение

function GetNextNumber:Integer;

begin

Result := NextNumber;

Inc(NextNumber);

end;

procedure TFooThread.Execute;

var

i:integer;

r:DWORD;

begin

OnTerminate:= Form1.ThreadsDone;

if (Form1.RadioButton1.Checked = False) //без синхронизации

then

begin

for i:=1 to MaxSize do

begin

GlobalArray[i] := GetNextNumber;

Sleep(5);

end;

end

else //с синхронизацией

begin

repeat

r := WaitForSingleObject(hnd, INFINITE); //семафор-1

until r = WAIT_OBJECT_0;

for i:=1 to MaxSize do

begin

GlobalArray[i] := GetNextNumber;

Sleep(10);

end;

ReleaseSemaphore(hnd, 1, nil); //семафор+1

end;

end;

procedure TForm1.ThreadsDone(Sender:TObject);

var

i:integer;

begin

Form1.Button1.Visible:=False;

if RadioButton1.Checked=false //без синхронизации

then

begin

inc(DoneFlags);

if (DoneFlags = 3)

then

for i:=1 to MaxSize do

ListBox1.Items.Add(IntToStr(GlobalArray[i]));

end

else //с синхронизацией

begin

inc(DoneFlags);

if (DoneFlags = 3)

then

begin

for i:=1 to MaxSize do

ListBox1.Items.Add(IntToStr(GlobalArray[i]));

CloseHandle(hnd);

end;

end;

end;

//По нажатию клавиши создать нити

procedure TForm1.Button1Click(Sender: TObject);

begin

if (Form1.RadioButton1.Checked = False) //без синхронизации

then

begin

TFooThread.Create(False);

TFooThread.Create(False);

TFooThread.Create(False);

end

else

begin //с синхронизацией

hnd := 0;

hnd := CreateSemaphore(nil, 1, 1, nil);

TFooThread.Create(False);

TFooThread.Create(False);

TFooThread.Create(False);

end;

end;

end.