Лабораторные работы / Задания / ЛР 3 СИНХРОНИЗАЦИЯ ПОТОКОВ — копия
.pdf
|
|
|
Лабораторнаяработа№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.Студент,сдающийработу , долженАРГУМЕНТИРОВАННОобосноватьзадачу,
выбрадлясиннуюхронизацииметодсинхрон. зации