logo

Mutekslar yordamida umumiy ma'lumotlarni himoya qilish. Oqimlar massivi

Загружено в:

10.08.2023

Скачано:

0

Размер:

167.384765625 KB
Mutekslar yordamida umumiy 
ma'lumotlarni himoya qilish. 
Oqimlar massivi                 Mutekslar yordamida umumiy 
ma'lumotlarni himoya qilish.                 Mutex nima?

Muteks("mutual exclusion" - o'zaro istisno) asosiy 
sinxronizatsiya mexanizmidir. U xotira to'siqlaridan 
foydalangan holda bir nechta oqimlar uchun umumiy 
ma'lumotlarga o'zaro eksklyuziv kirishni tashkil qilish 
uchun mo'ljallangan (oddiylik uchun siz mutexni umumiy 
ma'lumotlarga olib boradigan eshik sifatida tasavvur 
qilishingiz mumkin).

Sintaksis

Sarlavha fayli |  #include<mutex>

E'lon qilish|  std::mutex mutex_name;                 
Muteksni qulflash  |   mutex_name.lock();

  Oqim mutex bilan himoyalangan umumiy ma'lumotlardan eksklyuziv 
foydalanishni talab qiladi. Keyin hodisalarning rivojlanishining ikkita 
stsenariysi mavjud: mutex oqim tomonidan qulflanadi(bu holda boshqa 
hech qanday oqim bu ma'lumotlarga kira olmaydi) yoki oqim bloklanadi 
(agar mutex allaqachon boshqa oqim tomonidan qulflangan bo'lsa).

Muteksni ochish  | mutex_name.unlock(); 

Resursga ehtiyoj qolmaganda, joriy egasi boshqa mavzular manbaga kirishi 
uchun qulfni ochish funksiyasini chaqirishi kerak. Muteks bo'shatilganda, 
kirish kutilayotgan oqimlardan biriga beriladi.                                  
Agar sizda mutex mavjud bo'lsa,  lock()  ga qo'ng'iroq 
qilmang.

  Muteks allaqachon qulflangan va qayta qulflashga 
urinishlar sizni cheksiz kutish holatiga olib keladi. Agar 
sizga qulflash juda ham kerak bo'lsa, 
std::recursive_mutex  sinfidan foydalanishingiz 
mumkin.  Rekursiv mutex  bir xil oqim tomonidan ko'p 
marta ishlatilishi mumkin, lekin u bir xil miqdorda 
ochilishi kerak.                 Lock guard va RAII paradigmasi

Unlock()  ga qo'ng'iroq qilishni unutib qo'ysak nima bo'ladi? 

Resurs mutexning butun umri davomida mavjud bo'lmaydi va mutexni 
qulfdan chiqarilgan holatda yo'q qilish noaniq xatti-harakatlarga olib 
keladi.

Unlock()  chaqiruvidan oldin istisno qilinsa nima bo'ladi? 

unlock()  hech qachon bajarilmaydi va bizda yuqorida sanab o'tilgan barcha 
muammolar bo'ladi.

Yaxshiyamki, muammolarni  std::lock_guard  klassi yordamida hal qilish 
mumkin. Muteksni RAII ( Resource Acquisition Is Initialization , Resurslarni 
olish - boshlash) paradigmasi yordamida chiqarish har doim kafolatlanadi. 
Bu quyidagicha yuz beradi: mutex  lock_guard  ichida inkapsullangan bo'lib, 
u o'z konstruktorida  lock()  ni va qo'llanish doirasidan chiqib ketganda 
uning destruktorida  unlock()  ni chaqiradi. Bu hatto istisnolardan ham 
xavfsizdir: stekni ochish destruktorni chaqirish orqali  lock_guard ni yo'q 
qiladi va shu bilan mutexni bo'shatadi.

std::lock_guard<std::mutex> lock_guard_name(raw_mutex);                 
#include <mutex>
std::mutex door; // mutexni elon qilish
void func()

{  
std::lock_guard<std::mutex>  lg(door);  
/* lg ning konstruktori chaqiriladi bu door.lock() ga 
ekvivalentdir.  */
/*-----------------------*/
/*   func funksiyasidan monopol foydalanish kafolatlangan * /
/*-----------------------*/}  /* lg ko’rinish sohasidan chiqadi va 
destruktor chaqiriladi bu esa door.unlock();  ga 
ekvivalentdir*/                 Unique lock

Muteksga egalik olingandan keyin ( std::lock_guard tufayli ), uni ozod qilish 
mumkin. 

std::unique_lock  xuddi shunday ishlaydi va  RAII  paradigmasining bir xil 
xavfsizlik afzalliklaridan foydalangan holda mutexni bir necha marta (har 
doim shu tartibda) qulflash va chiqarish imkonini beradi.

std::unique_lock<std::mutex> 
unique_lock_name(raw_mutex);                 
#include <mutex>
std::mutex door; //  mutexni elon qilish
void func { 
std::unique_lock<std::mutex>  ul(door); 
/* lg ning konstruktori chaqiriladi bu door.lock() ga ekvivalentdir.  */
/*-----------------------*/
/*   func funksiyasidan monopol foydalanish kafolatlangan * /
door .unlock() ; 
//  buyruqlar…..
// ....
//
door .lock() ;
// Yana func dan monopol tarzda foydalanish kafolatlanadi }  /* unique_lock 
ko’rinish sohasidan chiqadi va destruktor chaqiriladi bu esa door.unlock();  
ga ekvivalentdir  */                 E’tiboringiz uchun rahmat!

Mutekslar yordamida umumiy ma'lumotlarni himoya qilish. Oqimlar massivi

Mutekslar yordamida umumiy ma'lumotlarni himoya qilish.

Mutex nima?  Muteks("mutual exclusion" - o'zaro istisno) asosiy sinxronizatsiya mexanizmidir. U xotira to'siqlaridan foydalangan holda bir nechta oqimlar uchun umumiy ma'lumotlarga o'zaro eksklyuziv kirishni tashkil qilish uchun mo'ljallangan (oddiylik uchun siz mutexni umumiy ma'lumotlarga olib boradigan eshik sifatida tasavvur qilishingiz mumkin).  Sintaksis  Sarlavha fayli | #include<mutex>  E'lon qilish| std::mutex mutex_name;

 Muteksni qulflash | mutex_name.lock();  Oqim mutex bilan himoyalangan umumiy ma'lumotlardan eksklyuziv foydalanishni talab qiladi. Keyin hodisalarning rivojlanishining ikkita stsenariysi mavjud: mutex oqim tomonidan qulflanadi(bu holda boshqa hech qanday oqim bu ma'lumotlarga kira olmaydi) yoki oqim bloklanadi (agar mutex allaqachon boshqa oqim tomonidan qulflangan bo'lsa).  Muteksni ochish | mutex_name.unlock();  Resursga ehtiyoj qolmaganda, joriy egasi boshqa mavzular manbaga kirishi uchun qulfni ochish funksiyasini chaqirishi kerak. Muteks bo'shatilganda, kirish kutilayotgan oqimlardan biriga beriladi.