POSIX sinxronizatsiya ob'ektlaridan foydalanish
Quyidagi dastur standart kiritishdan satrni o'qiydi va uni standart chiqishga chop etadi. Satrni o'qish va uni chiqarish uchun ikkita vazifa (ip) yaratiladi, ularning kodi mos ravishda o'quvchi va yozuvchi funktsiyalari . Vazifalar ularni yaratgan jarayon bilan bir xil manzil maydonida bajarilganligi sababli, ular avtomatik ravishda barcha o'zgaruvchilarni, shu jumladan msgbuf xabar buferini almashadi. Muhim umumiy resurslarga (o'zgaruvchilar bajarildi, msglen, msgbuf) kirishda o'zaro istisno qilishni tashkil qilish uchun mutex mutx sinxronizatsiya ob'ekti ishlatiladi.
#include
#include
/* POSIX-ga mos keladigan tizimlarda kompilyatsiya qiling (masalan, Linux): */
/* ss < fayl_nomi > -lpthread * /
#BUF_LEN 256 ni aniqlang
pthread_mutex_t mutx; /* Ob'ekt sinxronizatsiya mutex yozing */
int bajarildi; /* Ish tugaganligi belgisi */
intmsglen; /* Xabar uzunligi */
char msgbuf[BUF_LEN]; /* Xabar buferi */
/* Xabarni kuting, u kelganda uni ekranda ko'rsating. Funktsiya operatsion tizim tomonidan chaqirilgan mustaqil vazifa sifatida ishlaydi, shuning uchun prototip o'rnatiladi.
argp argumenti ishlatilmaydi. */
bekor * yozuvchi (void * argp)
{
uchun (;;)
{
pthread_mutex_lock(ftmutx); /* " qo'lga olish " mutex */
agar (bajarilgan)
{
/* Joriy vazifa identifikatorini chop etish */
printf("%x mavzu chiqadi\n", (int)pthread_self()); pthread_mutex_unlock(ftmutx); /* " reliz " mutex */ pthread_exit(0); /* tugatish vazifa */
qaytish 0; /* hech qachon */
}
agar (msglen)
{
printf("*>%s\n",msgbuf); /* chiqdi ustida ekran */
msglen=0;
}
pthread_mutex_unlock(ftmutx); /* " bepul " mutex */
/* Vazifani bir xil ustuvorlikka ega tayyor vazifalar qatorining oxiriga qo'ying */ /* bir xil ustuvorlik */
sched_yield();
}
}
/* Xabarni o'qing va uni buferga qo'ying.
Funktsiya operatsion tizim tomonidan chaqirilgan mustaqil vazifa sifatida ishlaydi, shuning uchun prototip o'rnatiladi.
argp argumenti ishlatilmaydi. */
bekor * o'quvchi (void * argp)
{
uchun (;;)
{
pthread_mutex_lock(ftmutx); /* " qo'lga olish " mutex */
agar (!msglen )
{
/* Xabarni o'qing. Ctrl+D yo'q */
agar (ifgets (msgbuf, BUF_LEN, stdin))
sindirish;
msglen = strlen(msgbuf) + 1;
}
pthread_mutex_unlock(ftmutx); /* " bepul " mutex */
/* Vazifani mavzu bilan tayyor topshiriqlar navbatining oxiriga qo'ying */
/* bir xil ustuvorlik */
sched_yield();
}
/* Joriy vazifa identifikatorini chop etish */
printf("Mavzu % x chiqadi\n", (int)pthread_self());
pthread_mutex_unlock(ftmutx); /* "bepul" mutex */
pthread_exit ( 0 ); /* yakuniy vazifa */
qaytish 0; /* hech qachon */
}
int asosiy ()
{
pthread_t _ _ wtid , rtid ; /*vazifa tavsiflovchilari*/
agar (pthread_mutex_init (ftmutx, 0)) /* mutex yaratish */
perror("pthread_mutex_init");
agar (pthread_create (ftwtid, 0, writer,0)) /* yaratish vazifa */
perror("pthread_create");
agar (pthread_create (ftrtid, 0, o'quvchi, 0)) /* yaratish vazifa */
perror("pthread_create");
agar (!pthread _join (rtid, 0)) /* kuting Bitiruv rtid vazifalari */
bajarildi = 1;
pthread_join(wtid, 0); /* kuting Bitiruv aniq vazifalar */
agar (pthread_mutex_destroy (ftmutx)) /* mutexni o'chirish */
perror("pthread_mutex_destroy");
qaytish 0;
}
Agar ushbu dastur ishlayotgan vaqtda tizimdagi vazifalar ro'yxatiga qarasak, ushbu dasturda to'rtta (!) borligini ko'ramiz:
ishlash jarayoni,
mos keladigan "asosiy" vazifa ,
o'quvchi funktsiyasiga mos keladigan vazifa ,
yozuvchi vazifasiga mos keladigan vazifa.
Yuqoridagi dastur quyidagi ma'noda mutlaqo to'g'ri emas. O'quvchi/'yozuvchi funksiyalarining har biri ikkinchi yozuvchi/'o'quvchi funksiyasi faqat sched_yield chaqirilganda mutex mutx chiqishini kutishini taxmin qiladi . Ushbu dastur uchun bu taxmin to'g'ri, lekin umuman olganda, o'quvchi / 'yozuvchi funktsiyasi bajarilgandan so'ng, keyingi yozuvchi / 'o'quvchi band bo'lsa (oldingi xabarni qayta ishlamagan) bajarilishini ta'minlash kerak. , keyin joriy vazifa kutish holatiga o'tishi kerak va CPU resurslarini foydasiz so'rov jarayonida iste'mol qilmang. Quyida ushbu dasturning o'zgartirilgan versiyasi mavjud bo'lib, u umumiy ma'lumotlarga kirishda o'zaro istisno qilish uchun mutex ob'ektiga qo'shimcha ravishda vazifalarning o'zini sinxronlashtirish uchun condvar ob'ektidan foydalanadi. pthread_cond_wait funktsiyasi bilan vazifa boshqa vazifadan ma'lumotlarni kutish rejimiga o'tadi va pthread_cond_signal funktsiyasi bilan ma'lumotlar tayyorligi haqida xabar beradi.
Do'stlaringiz bilan baham: |