Мои Конспекты
Главная | Обратная связь

...

Автомобили
Астрономия
Биология
География
Дом и сад
Другие языки
Другое
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Металлургия
Механика
Образование
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Туризм
Физика
Философия
Финансы
Химия
Черчение
Экология
Экономика
Электроника

Interface





Помощь в ✍️ написании работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

 

uses Windows;

 

Type

TSimpleSynchronizer = class(TObject)

Private

FDataLock, FWriteLock: TRTLCriticalSection;

FActRead, FReadRead, FActWrite, FWriteWrite: integer;

FReaderSem, FWriterSem: THandle;

Public

constructor Create;

destructor Destroy; override;

procedure StartRead;

procedure StartWrite;

procedure EndRead;

procedure EndWrite;

end;

 

Implementation

 

constructor TSimpleSynchronizer.Create;

Begin

inherited Create;

InitializeCriticalSection(FDataLock);

InitializeCriticalSection(FWriteLock);

FReaderSem := CreateSemaphore(nil, 0, High(Integer), nil);

FWriterSem := CreateSemaphore(nil, 0, High(Integer), nil);

{ Initial values of 0 OK for all counts }

end;

 

destructor TSimpleSynchronizer.Destroy;

Begin

DeleteCriticalSection(FDataLock);

DeleteCriticalSection(FWriteLock);

CloseHandle(FReaderSem);

CloseHandle(FWriterSem);

inherited Destroy;

end;

 

procedure TSimpleSynchronizer.StartRead;

Begin

EnterCriticalSection(FDataLock);

Inc(FActRead);

if FActWrite = 0 then

Begin

Inc(FReadRead);

ReleaseSemaphore(FReaderSem, 1, nil);

end;

LeaveCriticalSection(FDataLock);

WaitForSingleObject(FReaderSem, INFINITE);

end;

 

procedure TSimpleSynchronizer.StartWrite;

Begin

EnterCriticalSection(FDataLock);

Inc(FActWrite);

if FReadRead = 0 then

Begin

Inc(FWriteWrite);

ReleaseSemaphore(FWriterSem, 1, nil);

end;

LeaveCriticalSection(FDataLock);

WaitForSingleObject(FWriterSem, INFINITE);

EnterCriticalSection(FWriteLock);

end;

 

procedure TSimpleSynchronizer.EndRead;

Begin

EnterCriticalSection(FDataLock);

Dec(FReadRead);

Dec(FActRead);

if FReadRead = 0 then

Begin

while FWriteWrite < FActWrite do

Begin

Inc(FWriteWrite);

ReleaseSemaphore(FWriterSem, 1, nil);

end;

end;

LeaveCriticalSection(FDataLock);

end;

 

procedure TSimpleSynchronizer.EndWrite;

Begin

LeaveCriticalSection(FWriteLock);

EnterCriticalSection(FDataLock);

Dec(FWriteWrite);

Dec(FActWrite);

if FActWrite = 0 then

Begin

while FReadRead < FActRead do

Begin

Inc(FReadRead);

ReleaseSemaphore(FReaderSem, 1, nil);

end;

end;

LeaveCriticalSection(FDataLock);

end;

 

end.

Если читателю еще не все понятно, не паникуйте! Этот объект синхронизации с первого взгляда понять нелегко! Изучайте его внимательно в течение нескольких минут, и если у вас начнет двоиться в глазах прежде, чем вы разберетесь, то не беспокойтесь об этом и двигайтесь дальше!

Доверь свою работу ✍️ кандидату наук!
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой



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







©2015-2020 mykonspekts.ru Все права принадлежат авторам размещенных материалов.