Лекция №5. Ағындарды синхронизациялаудағы қосымша әдістері
Істер
ЕСКЕРТПЕ:
Бұғатталған қосымша қызметтер
1.04M
Категория: ИнтернетИнтернет

Ағындарды синхронизациялаудағы қосымша әдістері

1. Лекция №5. Ағындарды синхронизациялаудағы қосымша әдістері

Құрастырушы: А.Ж.Саринова
ЛЕКЦИЯ №5. АҒЫНДАРДЫ
СИНХРОНИЗАЦИЯЛАУДАҒЫ ҚОСЫМША
ӘДІСТЕРІ

2. Істер

ІСТЕР
Ядроның соңғы объектісі синхронизациялауға қалған – ол
істер. Бұл объектіні басқа ағындарды ақпараттандыру үшін
қолданады. Яғни, бір істер болған жайлары туралы
хабарлау. Істердің ең қосымша мүмкіншілігі, ол сигналдық
күйге бір дескриптор келген кезде, бірге күтуден бірнеше
ағындарды босату мүмкіндігі еді. Істер автоматты түрде
лақтырылатын және қолмен лақтырылатын болып екіге
бөлінеді. Бұл істің мүмкіншілігі CreateEvent функциясын
шақырғанда орнатылады.
• Қолмен лақтырылатын іс, бұл істі күтіп тұрған
ағындардың біреуінеде белгі бермейді.
• Автоматты түрде лақтырылатын іс, бұл істі күтіп тұрған
бір ғана ағынға белгі береді және автоматты түрде
лақтырылады.

3.

CreateEvent, OpenEvent, SetEvent, ResetEvent және
PulseEvent функциялары істерді қолданады.
HANDLE CreateEvent ( LPSECURITY_ATTRIBUTES lpsa, BOOL
fManualReset, BOOL fInitialState, LPCTSTR lpszEventName)
OpenEvent функциясын басқа үрдістерден бар істерді ашу
үшін қолданады. Істерді басқаруда үш функця қолданады:
BOOL SetEvent (HANDLE hEvent)
BOOL ResetEvent (HANDLE hEvent;
BOOL PulseEvent (HANDLE hEvent)
Ағын SetEvent функциясы арқылы істі сигналдық күйге
ауыстыра алады. Егер іс автоматты түрде лақтырылса,
онда жалғыз күтуші ағын босатылады. Ал іс болса
автоматты түрде сигналсыз күйге ауысады.

4.

Егерде іс қолмен лақтырылса, онда ағын
берілген іске қатысты ResetEvent функциясын
шақырмайынша, іс сигналдық күйде қалады.
PulseEvent функциясы барлық істерді босатады.
WaitForMultipleObjects функциясын барлық
істерді күтуде қолданғанда абай болыңыз.
Істерді қолдануда төрт моделі
SetEvent және PulseEvent функцияларымен бірге
орнатылатын қолмен және автоматты істерді
орнатуда төрт жолы бар.

5. ЕСКЕРТПЕ:

Істі дұрыс пайдаланбау жарысу күйін тудыруы
мүмкін, бұл өз кезегінде қателерді тудырады.
Автоматты түрде лақтыру ісін, мысалға келтіретін
болсақ. Пуржинасы бар есіктің механизмі
сияқты қарастырсақ, яғни есік ашылғаннан
кейін жабылып қалады. Ал қолмен лақтыру ісінде
пуржинасы жоқ есік сияқты, ашық күйде қалады.
PulseEvent функциясын қарастыратын болсақ,
онда есік ашылады және тез қайтадан бір күтіп
тұрған ағын өткеннен кейін жабылады. Ал
SetEvent функциясында есік ашылады және
ашық күйде қалады.

6.

7. Бұғатталған қосымша қызметтер

БҰҒАТТАЛҒАН ҚОСЫМША ҚЫЗМЕТТЕР
Ары қарай бірнеше қызметтер көрсетілген. Олар жай
операцияны салыстырумен және айнымалылардың
жұбын алмастыруын рұқсат етеді.
Бұғатталған айырбас бір айнымалыны екіншісіне
жазады:
LONG InterlockedExchange(LPLONG Target, LONG Value)
Қызмет Target айнымалысына ағымдағы мағынасын
қайтарып, оған Value мағынасын қосады. Target
айнымалысы сөздермен тегістелуі керек.

8.

InterlockedExchangeAdd қызметі бірінші мағынаға екіншісін қосады.
LONG InterlockedExchangeAdd (PLONG addend, LONG Increment)
Increment айнымалысы Addend айнымалысына қосылып, Addend-тің
негізгі мағынасын қайтарады.Бұл кызмет айнымалыны екі есе (немесе
одан да үлкен) өсірудің атомдық операциясын орындауға рұқсат береді.
Ал InterlockedIncrement-пен мұндай операциялар жасауға болмайды.
Соңғы InterlockedCompareExchange кызметі InterlockedExchange
қызметіне ұқсас. Айырмашылығы: Теңдік орындалған жағдайда ғана
айырбас жасалына алады.
PVOID InterlockedCompareExchange (PVOID *Destination, PVOID Exchange,
PVOID Comparand)
Бұл қызмет атомдық операцияларда келесі әрекеттерді орындайды:
Temp = *Destination
If (*Destination= = Coparand) *Destination = Exchange;
Return Temp;

9.

Осы кызметтің бір айнымалысы ол критикалық кода
секциясының бұғатталуын қолданады. *Destination
айнымалысы “бұғаттау айнымалысы” болып
табылады. Оған 1 болса “бұғатталған”, ал 0 болса
”бұғаттан алынған” деп есеп теледі. Exchange
айнымылысы 0 мәнді болуы тиіс, ал Comparand болса
1 мәнін. Егер де қызмет 1 мағынасын қайтарса, онда
шақырылған ағын кызметі өзінің “билігіне”
критикалық секциясын алады. Басқалай ол “ұйқтап
қалу ” немесе ”циклденіп” бірнеше уақыт керек емес
циклді орындап, содан соң қайта көру керек. Бұл
циклдену –EnterCriticalSection қызметі тура осы
кызметті күту кезінде орындайды.

10.

Бақылау сұрақтары:
1. Оқығалардың түрлері.
2. Оқығаларды қолданудың төрт үлгісі.
3. Бұғатталған кызметті тағайымдау.
English     Русский Правила