Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторные работы / Задания / ЛР 3 СИНХРОНИЗАЦИЯ ПОТОКОВ — копия

.pdf
Скачиваний:
14
Добавлен:
15.02.2021
Размер:
199.56 Кб
Скачать

 

 

 

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

 

 

 

 

 

Методыс

инхрпотоковнизация

 

 

Цельработы:п

олучепрактическихнавыкиепоиспользованию

Win32 API для

синхронизации потоков.

 

 

 

 

 

 

 

 

Синхронизацияпотоков

 

 

Выполняющимсяпотокамчастонеобходимокаким

 

 

 

-тообразомвзаи . одействовать

 

Наприм,еслинесколькорпотокпытаютсядоступвлучитькнекоторымглобальным

 

 

 

данным,токаждомупотокунужнопреданныеохранятьотизмдругимпотокомнения.

 

 

 

 

Иногдаодномупотокунужнополучитьинфортом,когдадругойациюпотокзавершит

 

 

 

 

выполнениезадачи

.Такоевзаимодействие

возможно междупоткаодногок,таками

 

разныхпроцессов.

 

 

 

 

 

 

Синхронизацияпотоков(

 

thread synchronization) - этообобщетермин,от осящийсяый

 

кпроцессувзаимодействзаимоспотоков. язиия

 

 

 

Синхрпотоковнизация

может

потребовать привлечениякачепосредникасамойтвеоперационнойсистемы.Потоки

 

 

 

разныхпроцессов

немогутвзаимодействоватьдругдругомбееучастия.

 

 

 

ВWin32сущнесметодовтвуетколькосинхронизациипотоков.

 

Привсейихсхожести,

 

частооказывается

,чтовк нкре

тнойситуацийодинметодболеепредпочтителен,чемдругой.

 

 

 

 

 

Критическиесекции

 

 

Одинизметодовсинхронпотсостоитвковзацииспользованиикр секцийтическ х

 

 

 

(critical sections)Этоединс. методсинхронизациивенныйпот,к нетктребуетрыйв

 

 

 

привлеченияядра

Windows,тоесть

критичсекциянявлскаяобъектомется.дра

 

Как

следствиеэтого

этотметодможетиспользоватьсяолькодлясинхрпотокнизациидногов

 

 

процесса.

 

 

 

 

 

 

Критическаясекция

— этонекоткоторыйучасток, давкаждыймомврентмени

 

 

можетвыптооднимльконятьизп .Етоковскод,яисполидинициализацииьзуемыйя

 

 

 

массива,поместикритическуюсекцию, другиеьопотокинесмогвойтиэтотучасток

 

 

 

 

кодадотехпор,покапервыйпотокнезавершитеговыполнение.

 

 

 

 

 

Доиспользованиякрит

 

ичессекциницнеобходойееиспомощьюализировать

 

 

процедурыWin32 APIкотоопInitializeCriticalSection(),рведеляетсяая

Delphi)следующим

образом:

 

 

 

 

 

 

procedure InitializeCriticalSection(var IpCriticalSection: TRTLCriticalSection); stdcall;

ПараметрIpCriticalSectionпредставляетсобойзаписьтипаTRTLCriticalSection,которая

 

передаетсяпоссылке.ТочноеопределензаписиTRTLCriticalSectionнеимеетбольшого

 

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

-либозаглядыватьеесодержимое.От

2

вас требуетсялишьперн датьинициализированнуюзаписьараметрIpCtitical Section,

этаз будетписьтутжезаполненапроцедурой.

Послезаполненияв исирограммеможносоздакрисекциютьическую,поместив

некоторыйучастокеетекстамеждувызовамифу нкцийEnterCriticalSection()и LeaveCriticalSection()Этипропредцедурысл образомдуля:ютсящим.

procedure EnterCriticalSection(var IpCriticalSection: TRTLCriticalSection); stdcall; procedure LeaveCriticalSection(var IpCriticalSection: TRTLCriticalSection); stdcall;

ПараметрIpCriticalSection,котоперэтимедаетсяыйпроцедурамявляетсянечеминым,

какзаписью,созданнойпроцедуройInitializeCriticalSection().

Функция EnterCriticalSection про,невыполняетеряетлиужекакой -нибудьдругой потоккр итическуюсекциюсвоейпрограммы,связданнобъеккриуюымтомической секции.Еслнет,потокполучаетразрешениенавыполнениесвоегокритическогокода,

точнее,емузапрещэтодел.Еслида,тотьютпобратившийся, токзапросом,

переводитсясос тоянож,аоизапроседанияделаз .Такпиекактнужносясоздавать записи,объекткри« секцияическая»предсобойставляетруктуруданных.

Когдафункция LeaveCriticalSection вызываетсяпот,ковладееткорыйтекущийм момеразрешениемвыполнениет своейкритическойсе ,одасвязцииданнойым объектомкритическая« секция»,системаможетпроверить,нетлиочед потокаугогоеди,

ожидающегоосвобэтобъектаждения.Затемсистемаможетвынестиждущийпотокиз состояданияож,ионпродолжи тсвоюработу(выделевремениеемукван)т. ы

Поокончработысз пнTRTLCriticalSectionисьюинеобходимоосвободитьее,вызвав процедуруDeleteCriticalSection(),котоопрследаяеобразомдующимляется:

procedure DeleteCriticalSection(var IpCriticalSection: TRTLCriticalSection); stdcall;

Длятого,чтообойтиылокипотокаобращовкуизанятойсекцниии , есть функция TryEnterCriticalSection(),котпозволяетраяпроверкрисекциютинатьческую

занятость.

 

Синхронизациясиспользованиемобъектовяд

ра

Многиеобъеядра,вкпроцесстылючая,поток,файл,мьютекс,семафор,уведомлениеоб

 

изменениифайласобытие,могутнаходитьсяв

одномиздвухсостояний

- «свободно»

(signaled)изанято«» (

nonsignaled)Вероятно. ,прощепредссебеэобъектиавлятьы

 

подключеннымилампочке

. Есветгоритли,объектсвободен,обратномслучаеобъект

 

занят.

 

 

 

 

 

3

 

 

Например,вмоментсозданияпроцессаегообъектядранаходитсявсостоянии

 

 

«занято»Когда. процзаверша,объексспервсоетходитссвободно«тояние»Анал. гично

 

 

выполняющиесяпотто(естьихобъектыки)пребвсостояниизв«а»,ютпереходятято

 

 

всостояниесвобо« »,когдазавершаютноработу.Нас делемомнекоторыеобъе,та иты

 

 

 

какмыютекс,семафор,событ,уведообизменениифайлаление,таймерожидания,

 

 

 

существуютисклюдлятого,чтобыительновырабатыватьсигналысвободно« »занято« ».

 

 

Смывсейэтой«игнализации»втом,чтобыпотокмогприостсвоюанавливатьботу

 

дотогомомента,когзадаобъектнныйперейдетвсостояниесвободно« »На. ,потокример

 

 

 

одногопроцессаможетвремерабннократитьдозаветудруг,пршенияогосто

 

 

 

под,кобъектждавгдаядраэтогодругпрперейдетоцесговсостояниесвободноа« ».

 

 

 

Посредствомвызовафункций

 

WaitForSingleObject

и WaitForMultipleObjects поток

приостанавливает вое выпдтогомоменталнение,когзадаобъектнныйили(объекты)

 

перейдетвсостояниесвободно« »Рассмотр. функцими

 

 

WaitForSingleObject,декларация

которой выглядиттак:

 

 

 

DWORD WaitForSingleObject(

 

 

 

HANDLE hHandle,

 

// Дескриптор

бъектаожидания

 

DWORD dwMilliseconds

//Времяожиданиявмиллисекундах

 

);

 

 

 

 

Параметр hHandle являетсядескриптобъекта,уведомлениесвр состояниибодном

 

которребуетсяполучитьго,

a dwMilliseconds - этовремя,котороевызыв

ающийпотокготов

ждать.Если

dwMilliseconds

равнонулю,фунемедленнокциявернеттекущийстатус

 

заданнобъе.Таобразомкготаим,можнопротестировсостояниеобъекта.Пар тьметру

 

 

 

можнотакжеприсваиватьзначениесимвольнойконстанты

 

 

INFINITE (= -1), вэ томслучае

вызывающийпотокбудетждатьнеограниченноевремя.

 

 

 

Функция WaitForSingleObject переводитвызыпотоксостояниеающождоданияй тогомоме,к гдапередастнтаемувозврзна.Нижещаемоечениеперечислены возможвозврначения:щаемые

WAIT_OBJECT_0 - объектнаходитсявсостояниисвободно« »;

WAIT_TIMEOUT - интерваложидания,заданный

dwMilliseconds, истек,

анужныйобъектпопрежнемунаходитсявсостояниизан« »;

 

WAIT_ABANDONED отнокситсямьютексулкоознача,чтообънеект былосвобожденпот,к владелткимрыйдосвоегозавершения;

WAIT_FAILED - привыполненфункциипрошибкаизошла.

Объектымьютекс« »

 

 

4

 

 

 

Мьютекс(MUTual Exclusions

— взаимоисключения)

- этообъектядра,котможнорый

 

исподсинхронизацииляьзоватьпото

 

ковизразныхпроцессов.Онможетпринадлежатьили

 

 

непринекоторомуадлежатьпотоку.Еслимьютекспринадлежитпотоку, оннаходитсяв

 

 

 

 

состояниизанято«»Еслидан. бъектнотыйниоситсядномупотоку, оннаходитсяв

 

 

 

 

состояниисвободно« »Другими.

 

словами,принадлеждлянегоозначаетбытьвсостояниить

 

 

 

«занято».

 

 

 

 

 

Еслимьютекснеприниодномуадлежитпотоку,первый,которыйоквызовет

 

 

 

функциюWaitForSingleObject,завлдаобъекннымдеваетитотпереходитвомсостояние

 

 

 

 

«занято»Вопределенном. с

 

мыслемьютекспохожнавыключат,которымможель

 

 

 

пользоватьсялюбойпотокпринципупервым« пришел

 

 

- первымобслужили» (first

-come-

first,-served).

 

 

 

 

 

Деловтом,чтоприпоспыткеомощьювызовафункцииWaitForSingleObjectзавладеть

 

 

 

мьютексом,которыйуже

находитсявсостояниизан«»,попереводитсяксостояние

 

 

 

ожиданиядотогомомента,когдаданныйобъектосвободится,тоестькогдавл« »делец

 

 

 

 

мьютексаегоосвободитпереведет( состояниесвободно« »).

 

 

 

 

 

Попринципусвоегодействиямьютексыочепохожин

 

 

 

акритическиесекции,за

 

исключениемдвухмоментов.Во

 

-первых,мьютексыможноиспдсинхронизацииляьзовать

 

 

потоков,переступаячег езанипро.Воцыессов

 

-вторых,мьютексуможноприсвоитьмя

 

путемссылкинаэтоимясоздатьдополнительныедескрипторы

 

 

 

уществующихобъектов

 

мьютексов.

 

 

 

 

 

Мьютексысоздаютсяпомощьюв функциизоваCreateMutex:

 

 

 

HANDLE CreateMutexi

 

 

 

 

LPSECURITY_ATTRIBUTES IpMutexAttributes,

 

 

 

 

 

//Указательнаатрибуты

защиты.

 

BOOL bInitialOwner,

флагпервоначальноговладельца. //

 

 

 

LPCTSTR IpName

 

//Указательнаимьютексая.

 

 

);

 

 

 

 

 

ПараметрIpMutexAttributes

 

— этоуканазатипапистельTSecurityft

 

ttributesОбычно.

 

вкачестведанногопарамперзначениетрадасnil,вэтслучаесяомиспользуются

 

 

 

атрибутызащиты,действующиепоумолчанию.

 

 

 

 

 

ПараметрblnitialOwnerоп ,следуетеделяетлисчитатьпо,создаокмь,егоющийтекс

 

 

 

владе.Есэтотлпараьцемие

 

трравенFalse,значмьютнеимеетвладельцакс.

 

 

 

ПараметрIpNameпредставляетимыот.Есливынексаобиприсваиватьаетесь

 

 

 

мьютексуимя,установитеэтотпаравнымтрЕслиnilжезначение. этогопараметра

 

 

 

 

отличнофункцnil,выполнитс стемея

 

поимьютексатакимжеименем.При

 

 

 

5

 

 

успешномзавершениипоискафункциявернетдескрипторнайденнмьютекса,в роготивном

 

 

 

случаевозвращаетсядескрипторновогомьютекса.Приналичииименэтотобъектможет

 

 

 

совместноиспользоватьнесколькимипроцессамия

.Есликаким

-топроцессомсоздается

 

мьютсим,потокекснемдругпрможетцессаговызыватьфункцииCreateMutexили

 

 

 

OpenMutexстемжесамымименем.Влюбомслучаесистемапростопередаствызывающему

 

 

 

потокудескрипторисходногомьютекса.Другойсп соб

овместноиспользоватьмьютекс

-

вызватьфункциюDuplicateHandle.

 

 

 

Чторабснесколькимиыотатьпроцессами,данныйобъектдолженбытьсовместно

 

 

 

используемым.Припрост:чинатобызавладетьмьютексилиосвободитьег,потокум

 

 

 

потребуетсяегодескриптор.Пот

окосвобождаетэтотобъектпомощьювызовафункции

 

 

ReleaseMutex:,

 

 

 

BOOL ReleaseMutex(

 

 

 

HANDLE hMutex

//Дескриптормьютекса.

 

 

);

 

 

 

Ачтослучится,есв адемьюпотоктексомщийзаве, ршитсяедварительноне освободив его?Вдействисиссамаосвобтемальнтакоймьютекс.ждаетстиПоток,

которвызфункциыйвает юWaitForSingleObjectдляэтогообъекта,получитвозвращенное значениеWAITкотороеуказываетABANDONED,навозникшиепробс олькочтоемы

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

Позавершениииспользовмьютексанеобходимокрытьнияегопомощьюфункции

Win32 API CloseHandle().

 

 

События

Событияиспользуютсявкачествесигналовзавершени

икакой -либооперации.Однако

в отличиемьютексов

,

онприениадлежат

одномупотоку.На, отримерАсоздаетк

событиепомощьюфункции

 

CreateEvent

иустанавливаетобъектсостояниезаня«».

ПотокВполучаетдескрипторэтогообъекта,вызвфункциюв

 

 

OpenEvent, затемвызывает

функцию WaitForSingleObject,чтобы приостановить рабдотмоментуго,когдапоАтока

завершконкретнуюзадачуиосвобуказанныйобъектдит.Когдаэтопроизойдет,система

 

выведетизсостоянияожиданияпотВ,к ткеперьорыйвладеетинформацией,чп Аток

 

завершилвыполненсвоейзадач. ие

 

 

 

Объявлениефункции

CreateEvent записывтакимобр: етсязом

6

HANDLE CreateEvent(

LPSECURITY_ATTRIBUTES IpEventAttributes,

 

 

 

 

//Указательнаатрибутызащиты.

 

BOOL bManualReset,

 

//Флагинтерактивногособытия.

 

BOOL bInitialState,

 

//Флагпервоначальногосостояния.

 

LPCTSTR IpName

 

//Указательнаимясобыти

я.

);

 

 

 

 

 

Этафункциявозвращаетдескрипторсоздаваемогообъектасобытие« »Первый. параметр

 

 

определяет,наслидескриедуетсяпорожденныт .Еслицессами

 

 

IpEventAttributes

имеетзначение

NULL,дескрипторнаслнеможетдоваться.

 

 

Еслипараметр

bManualResetимеетзначение

TRUE,топриосвобожденииъект

остаетстояниивэт мвотличобъекта( мъю« »)Эзначит. что,ексвпотокие,

 

 

 

ожидающиепереходаданногообъвсосксвободно«тояниеа»,будутвыведенысистемойиз

 

 

 

состоянияожидания.Т

 

акойобъектназываесобыручнымсбросомтиемся(

 

manual-reset

event), посколькуразбуженный« »выведенный( изсостоянияожидания)потокможет

 

 

 

самостоятельносбр объектатояниеитьсобытие«»взанято«»Еслипараметр.

 

 

 

bManualReset

имеетзначение

FALSE, тосистемаавтоматическисбрасываетсостояние

 

рассматриваемогообъемазанято«»послепробуждения« »первогопотока,ожидающего

 

 

 

освобданногобъектажден.Толькоодпотокивыводитсянизсостоянияожидания,как

 

 

 

случаемьютекс.Такоесобытназывмие

 

 

аютсобыавтиемоматическимсбросом(

auto-

reset event).

 

 

 

 

 

Параметр bInitialState определяетпервоначальноесосесли( ояние

 

TRUE,тосвободно« »,

если FALSE,тозанято«»)данногос .бытияПараметру

 

IpName можетбытьприсвоеномя

события.Имяпредоставляет

 

пособсовместногоиспольз,на римеросредствомвания

 

функции OpenEvent.

 

 

 

 

Вкачестдополнвеарианта,есливытельногонехотитеимдсвопросамилать

 

 

защиты,можноустановить

 

IpEventAttributes в NULL (0&)Втакомслучаедекларация. примет

 

следующийвид:

 

 

 

 

 

Declare Function CreateEvent Lib "kernel32" Alias "CreateEventA" ( _

ByVal IpEventAttributes As Long, _

By Val bManualReset As Long, _

By Val blmtialState As Long, _

By Val IpName As String _

) As Long

 

 

7

 

Также,какидругиедеск

 

рипторы,дескрипсобыдолженбытьзакрытияорс

 

использованиемфункции

CloseHandle.

 

Объявленфункциие

OpenEvent выглядиттак:

 

HANDLE OpenEvent(

 

 

 

DWORD dwDesiredAccess,

//Флагдоступа.

 

BOOL blnheritHandle,

//Флагнаследова

ния.

LPCTSTR IpName

//Указательнаимясобытия.

 

);

 

 

 

гдепараметр dwDesiredAccess можетприниматьодноизтрехзначений:

EVENT_ALL_ACCESS предодоставляетлныйк обытиютуп;

EVENT_MODIFY_STATE разрешаетиспольздескрипторабывание

тиявфункциях

 

SetEvent и ResetEvent,такчтовызывающийпроцеможетизменитьсостояние

 

 

данногособытия(ничегобольше)Этоважно. длясобытийсбросомвручную;

 

SYNCHRONIZE разрешаетиспольздескриповлюбыханфункцияхторае

 

ожиданиятаких(

как WaitForSingleObject),ждущихосвобданногобъектаждения.

Каждаяизэтихфункцийпринимаетдескрипсобывкачествеаргументаияор.Функция

 

SetEvent устанавлисостояниеданногособывсвает« »,иябодно

a Reset Event «сбрасывает»

собы,тоеспритиеь

сваиваетсобытиюстазанято«»,усфункция

PulseEvent вызывает

SetEvent дляосвобожденияжидпотоков,азатемющихвызывает

ResetEvent дляперевода

данногособытиявсостояниезанято«».

 

 

 

Семафоры

 

Существуетещеодинметодсинхронпот,вк исктзацииовром

пользуются

семафорнсемафорахобъектAPIВ ыприме. действиянмьютексовципен,но

 

добавлениемоднойсущесдетали.Внихзалвеннойвозмженапоресурсовдсчетажность,

 

чтоп зваранопрляечислутделенномупотокоднвойтиовсинхронизуеременно

мый

участкода.ДлякзданиясемафиспфункцияользуетсяраCreateSemaphore(),которая

 

объявляетсяследующимобразом:

 

 

function CreateSemaphoreflpSemaphoreAttributes:

PSecurityAttributes; llnitialCoimt,

iMaximumCount: Longint; IpName: PChar): THandle; stdcall;

 

КакивслучаефункцииCreateMutex(),первымпарапередаваемыметромфункции

CreateSemaphorявляетсяуканазапистельTSe(),причемcurityAttributes,значениеNil

8

соответсогласиюнаиспользовтвуетстандартныхатрибутовние.щиты

Параметрll nitialCountпредставляетсобойначальноезначесемафорногониетчика

объекта.Эточисломожетнаходивдиапазонедот0значенияьсяIMaximumCountСемафор .

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

WaitForSingleObject()илюбидр,ейуподобнуюгую,знасчесемафораниетчика

уменаединицуьш.Иается,оборпотокомпривыз функциивеReleaseSemaphore()

знасчесемафораниетчикаувеличнаединицу. вается

 

 

 

СпомощьюпараметраI

MaximumCountзадаетсямаксимальное

знасчениетчика

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

 

 

 

числодолжнопредставляобщееколичестводосресурсовьупных.

 

 

 

ПараметрIpNameсодержитимясемафора.Поведениеэтогопараметрааналогично

 

поведениюоднои

менногопараметрафункцииCreateMutex().

 

ФункцияReleaseSemaphoreисподувелиьзуемаязнасчесемафораниятчика()

 

имеетбольшепараметров,ч коллега"" ReleaseMutex()Объявление .

 

 

функции

ReleaseSemaphore() выглядит следующим образом:

 

function ReleaseSemaphore(hSemaphore: THandle; IReleaseCount: Longint; IpPreviousCount:

Pointer): BOOL;

stdcall;

 

 

 

СпомощьюпараметраIReleaseCountможнозадатьчисло,накотороебуменьшенодет

 

знасчесемафниетчика.Приэтомстароезнарачебудниетчика

 

 

етсохраненов

переменнойтипаLongint,накоторуюуказываетпараметрIpPreviousCount,еслиегозначение

 

 

 

неравноСкрытыйNil,смыслэтогосредсовсттом,чтоваоитсемафникнеогдар

 

 

 

приниодномуадлежит

 

 

 

 

отдельнопотоку.Предположим,чтомаксимальноеу

 

знасчесемафниетчикабылора

 

равно10,идесяповызвалитоковьфункциюWaitForSingleObject()Врезультатесчетчик

.

 

потоковсбрасывадонуляитемсамымсемафортсяпереводинедоссостояние. упноеся

 

 

 

Послеэтогодостатднизповызватьмучнотоковф

 

ункциюReleaseSemaphore()вкачестве

параметра lReleaseCountпередчисло10,ксемафортькнепробудетснтопропускатьва

 

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

 

 

до10Этом. средствощнмпривесжет

 

 

тиквозникновениювашемприложениитрудно

 

отслежош,поэтоибокслваиспользоватьедумыхуегобольшойосторожностью.

 

 

Семафогутбытьп прирылезнысовместномисп льзованииграниченныхресурсов.

 

Предположим,имеетсятриприложения,каждое

 

из которыхдолжновыполнитьвыводна

 

печать,укомпьютератолькодвараллельпорта.Устасемновивыхафорчальным

 

 

 

значениемсчетчикаресурсов,равнымдвум,можнозаставитьприложензапрашиватья

 

 

 

сервиспечатитолькотогда,когдаестьвободныйпараллельный

 

порт.

 

9

Дляосвобождениядескриптсемаф,выделенногоемуорапомощьюфункции

CreateSemaphore(),незабудьтевызватьфункциюCloseHandle().

Ждущиетаймеры

Ждущийтаймер(waitableпредставлясобойновыйtimer)типобъсинхронизацииектов,

поддерживаемый вWindowsверсии4выше.0.ЭтопNTлноцобъектсинхронизациинный,

котможетиспорыйдлорганизацьзоватьсязадержкодилнесколькихоми приложениях.

Ждущийтаймерработаетв режимах.Врежимеручного« сброса»таймерпереходит

вустановленн оесостояниеприистечзадандержкиостаетсяиинойустановленнымдо

техпор,покафункцияSetWaitableTimerнезадастновуюзадер.Врежимеку

 

«автоматическсброса»таймерперехустановлегодитстояприистечнноеиении

 

заданнойдержкиостаетс

яустановленнымдопервогоуспешноговызовафункции

ожидания.ВэтомрежимеоннапоминобъектEventврежимеаветоматическогосброса,

посколькукаждыйразприистечениивременизадержкиразрешаетсявыполнениелишьодной

 

нити.Наконец,ждущийтаймерможет

выполфункциитервальногояаймера,который

пересзадпускаетсяз ннойдержкойпослекаждогосрабатыванияобъекта.

 

Главнаяособенность,отличающаяждущтаймстемных,ры

— то,чтождущие

таймерымогутсовместноиспользоватьсянесколькимиприл

ожениями.Наприм,выможетер

приостановитьнесколькоприлф режиженновомтак,чтобыонийпросыпалисье« »

 

каждыенесколькочасовдлявыпнекоторойлненияоперации.

Процесполучаютдескрипждущихытаймтакоры, еониакполучаютв дескрипторымью тексов:дублированием,наследованиемилиоткрытиемпоимени.

Вследующейтаблицеперечислефункции,преддляработыазначенныесождущими

таймерами.

Функция Описание

CancelWaitableTimer Останраждущвливатаймеработу.Таймерго остаетсявтекущемсостоянии СгеаteWaitableTimer Создаобъждущеготаймеракт.Еслитаймер

заданнымименеужсуществует,оноткрывается

OpenWaitableTirner Открываетсущесждущийаймервующий

SetWaitableTimer

Запускаетждущийтаймерзаданной

10

продолжительностьюиинтерваломсрабатывания

 

 

 

СОДЕРЖАНИЕОТЧЕТА

1.

Наименованиелабораторнойработы,еецель.

 

2.

Исследованиенаконкретномпримереследующихметодов

синхронизациипотоков:

 

1)

критическиесекции

 

 

2)

мьтексы

 

 

3)

события

 

 

Задачудлясинхронизациивыбратьнасвоеусмотрение

.

3.Примерыразработанныхприложенийописание( программ,результатытексты программ).

Примечание:

1.

Задачидлякаждогометодасинхронидолжныбытьразличнымиации

.

2.

Задачидолжнынагляднодемонствыбметодрсинхронизациианныйровать

 

 

учитыватьегоособен

ности.

 

3.Студент,сдающийработу , долженАРГУМЕНТИРОВАННОобосноватьзадачу,

выбрадлясиннуюхронизацииметодсинхрон. зации