Программалық инженерия Орындаған: Ахметов Әбдімәжит Тобы: Прогик21-1 Қабылдаған: Саметова А. Алматы 2023



Дата03.02.2024
өлшемі1.7 Mb.
#490677
түріПрограмма
ЗЖ7-8. Ахметов Әбдімәжит, ПрогИк-21-1


ҚАЗАҚСТАН РЕСПУБЛИКАСЫ БІЛІМ ЖӘНЕ ҒЫЛЫМ МИНИСТРЛІГІ ҒҰМАРБЕК ДӘУКЕЕВ АТЫНДАҒЫ
«АЛМАТЫ ЭНЕРГЕТИКА ЖӘНЕ БАЙЛАНЫС УНИВЕРСИТЕТІ»
коммерциялық емес АҚ IT-инжиниринг кафедрасы
№ 7–8 Зертханалық жұмыс Пәні: Жүйелік бағдарламалау
Тақырыбы: Ағымдармен жұмыс ісеу Мамандығы: Программалық инженерия
Орындаған: Ахметов Әбдімәжит Тобы: Прогик21-1 Қабылдаған: Саметова А.

Алматы 2023


Linux жүйесіндегі ағындар туралы түсінік


Кез келген процесс кодты және ол өңдейтін деректерді іске қосады. Бір процесс fork() функциясын шақырғанда, сол кодты орындайтын жүйеде басқа процесс пайда болады. Бірақ бұл код өңдейтін деректер аталық процесс деректерінің тәуелсіз көшірмесі болып табылады. Мұны көрсету үшін шағын мысалды қарастырыңыз (листинг 11.1)

Сондай-ақ, егер ағындардың біреуі бағдарламаны аяқтаса, онда барлық басқа ағындар дереу тоқтатылатынын түсіну керек. Бұл ағындар мен процестер арасындағы тағы бір маңызды айырмашылық. Енді шағын мысалды қарастырайық (11.2 листинг).


Бұл бағдарлама «Hello World» хабарламасын басып шығарады, 5 секунд күтеді, екінші «Goodbye World» хабарламасын басып шығарады және шексіз циклге өтеді. Бағдарламадан мәжбүрлеп шығу үшін + пернелер тіркесімін басыңыз. Сонымен, хабарламалар арасындағы бес секундтық үзіліс бағдарламаның any_func () функциясының аяқталуын күтуіне байланысты.
Енді any_func() ағынды функция болатындай бағдарламаны жаңартып көрейік (11.3 тізімі).




Деректерді ағынға жіберу үшін pthread_create() функциясының төртінші аргументі қолданылады. Бұл көрсеткіш автоматты түрде ағындық функцияның дәлелі болады. Келесі мысал осы мүмкіндікті көрсетеді (листинг 11.5).

Берілген мысалда бағдарламаның бірінші аргументі (argv[1]) бүтін санға айналады, содан кейін ол ағындық функцияға беріледі. Егер бірнеше аргументтерді ағынға жіберу қажет болса, онда оларды құрылымға орналастыруға болады, оған көрсеткіш ағындық функцияға да беріледі. Бұл тәсіл келесі мысалда көрсетілген (листинг 11.6).



Келесі бағдарлама (листинг 11.7) тәуелсіз жұмыс істейтін екі ағынның құрылуын көрсетеді.





Ағынды аяқтау: pthread_exit()


Егер ағындық функция басқа функцияларды шақырса, онда pthread_exit() мұндай жағдайларда өте пайдалы болады. RESULT аргументі кейінірек қарастырылады. Келесі мысал (листинг 11.8) pthread_exit() функциясының жұмысын көрсетеді.


#include #include
void print_msg (void)
{
fprintf (stderr, "Hello World\n"); pthread_exit (NULL);
}
void * any_func (void * arg)
{
print_msg ();
fprintf (stderr, "End of any_func()\n"); return 0;
}
int main (void)
{
pthread_t thread;
if (pthread_create (&thread, NULL, &any_func, NULL) != 0) {
fprintf (stderr, "Error\n"); return 1;
}
while (1);
return 0;
}


Ағынды күту: pthread_join()

берілген код


өзгертілді. Себебі while(1) бойыншы ұзақ күту керек.

Келесі мысал (листинг 11.9) pthread_join() функциясының қалай жұмыс істейтінін көрсетеді.
Листинг 11.9. Join1.c мысалы

nano

Листинг 11.10. Join2.c мысалы.




Pthread_join() функциясын ағымдағы процесте жұмыс істейтін кез келген ағын шақыра алады. Мұны көрсететін мысалды қарастырыңыз (листинг 11.11).


Pthread_cancel() бірден оралса да, бұл ағынның бірден аяқталуын білдірмейтінін түсіну маңызды. Қарастырылып отырған функцияның негізгі міндеті — оны нақты жою емес, жою туралы сұраныс ағынына жеткізу. Осыған байланысты, егер сіз үшін ағынның жойылуы маңызды болса, оның pthread_join () функциясымен аяқталуын күту керек. 11.13 листингінде ағынның жойылуын көрсететін мысал бар.




Сонымен, ағынның жойылғанын білу үшін сол ағынмен қайтарылған мәнді оқып, оны PTHREAD_CANCELED тұрақтысымен салыстыру керек. Бұл тұрақты сіз ойлағандай бүтін сан емес, типтік емес көрсеткіш. 11.14 листингінде мінсіз бас тарту үшін ағынды тексеру қалай орындалатыны көрсетілген.





Достарыңызбен бөлісу:




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет