AMALIY ISH № 2. DASTURIY ARXITEKTURANING ASOSIY QOIDALARI.
Jarayon:
1. O'qituvchiga ishni bir nechta iplarga parallellashtirishni ta'minlaydigan o'z versiyasini oling.
2. O'rganilgan mexanizmlardan foydalanib, olingan vazifani bajaradigan dastur ishlab chiqing.
3. Hisobot yozing.
Mudofaadagi yutuqlar:
1. O'qituvchiga bir nechta iplarni ishlaydigan dasturni namoyish qiling.
2. Ilova dastur kodini tushuntiring.
Zamonaviy operatsion tizimlarda foydalanuvchilarga parallel ishlashning bir nechta turlari taklif etiladi, ularning asosiylari jarayon va iplardir. Jarayonlar - bu ish vaqti dasturlari. Iplar kichikroq ish qismidir. Biroq, resurslarni taqsimlash nuqtai nazaridan, bu asosiy bo'lgan mavzular, chunki ular emas, balki ular biron bir ishni bajarish uchun ma'lum vaqt davomida markaziy protsessor bilan ta'minlangan. Bir nechta operatsiyalarni bajaradigan WinAPI funktsiyalarini ko'rib chiqing.
CreateThread funktsiyasi qo'ng'iroq jarayonining manzil maydonida bajariladigan ipni yaratadi.
HANDLE CreateThread (
PSECURITY_ATTRIBUTES lpThreadAtributes,
// ipni himoya qilish xususiyatlari
DWORD dwStackSize, // baytning boshlang'ich oqimi hajmi
PTHREAD_START_ROUTINE lpStartAddress,
// oqim funktsiyasida ko'rsatgich
PVOID lpParameter, // yangi ip uchun parametr
DWORD dwCreationFlags, // bayroqlar oqim yaratadi
PDWORD lpThreadId
// qaytarilgan oqim identifikatoriga ko'rsatgich
);
Funktsiya muvaffaqiyatli bajarilgandan so'ng, yangi ipning dastasi qaytariladi. Agar funktsiya bajarilmasa, NULL ni qaytaradi.
Parametrlar:
LpThreadAttributes - qaytarilgan dastani bola jarayonlari orqali meros qilib olish mumkinligini aniqlaydigan SECURITY_ATTRIBUTES tuzilmasiga ishora. Agar lpThreadAttributes NULL bo'lsa, demak, dastani meros qilib olinmaydi.
DwStackSize - baytlarda yangi oqim uchun stack hajmini belgilaydi. Agar 0 belgilangan bo'lsa, standart stack hajmi ishlab chiqaruvchi oqimning suyakka o'lchamiga teng bo'ladi. Stek avtomatik ravishda jarayon xotirasi bo'shlig'iga joylashtiriladi va ip tugashi bilan bo'shatiladi.
LpStartAddress - Yangi oqimning boshlang'ich manzili. Odatda bu WINAPI chaqiruv konventsiyasi bilan e'lon qilingan va bitta parametr sifatida 32 bitli ko'rsatkichni oladigan va 32 bitli tugatish kodini qaytaradigan funktsiyaning manzili. Prototip: DWORD WINAPI ThreadFunc (LPVOID);
LpParameter - Oqimga uzatiladigan bitta 32-bitli parametr qiymatini belgilaydi.
DwCreationFlags - oqim yaratilishini boshqaruvchi qo'shimcha bayroqlarni belgilaydi. Agar bayroq CREATE_SUSPENDED bilan belgilangan bo'lsa, u holda kutish holatida ip yaratiladi va ResumeThread funktsiyasi chaqirilmaguncha bajarilmaydi. Agar bu qiymat nolga teng bo'lsa, yaratilishdan keyin zudlik bilan ip ishlaydi.
LpThreadId - 32-bitli o'zgaruvchiga ishora, u ip identifikatorining qiymatini oladi
Win32 API-ning quyidagi funktsiyalariga qo'ng'iroq qilib, siz zanjirni tugatishingiz mumkin:
VOID ExitThread (
DWORD ExitCode); // oqimning tugatish kodi
va
VOID TerminateThread (
HANDLE hThread, // tugatish kerak bo'lgan ip
DWORD ExitCode // oqim tugatish kodi
);
Bunga 1 dan 100 gacha bo'lgan barcha raqamlarning mahsulotini hisoblaydigan dasturning bo'lagi misol bo'ladi.
...
// oqim funktsiyasi
WINAPI DWORDFuction (PVOID Parametr)
{int proizv = 1; // mahsulot natijasi
int ii, * kk;
kk = (int *) Parametr;
uchun (ii = * k; ii <(* kk) + 50; ii ++) proizv * = ii;
qaytish proizv;
}
...
// mavzularni yaratish uchun qo'ng'iroq kodi
DWORD idThread;
int k1 = 1; k2 = 51;
QOLISH h1, h2;
// Ikki ip to'xtatilgan holatda yaratilgan
h1 = CreateThread (NULL, 0, ThreadFunction, va k1, CREATE_SUSPENDED, va idThread);
h2 = CreateThread (NULL, 0, ThreadFunction, va k2, CREATE_SUSPENDED, va idThread);
// ipning bajarilishi
RezyumeThread (h1);
RezyumeThread (h2);
...
Ushbu kodda juda foydali Win32 API funktsiyasi topilgan.
To'xtatilgan ipning ishini davom ettiradigan va quyidagicha tavsiflangan ResumeThread
DWORD RezyumeThread (
HANDLE hThread // davom ettirish uchun ip
);
Agar ushbu funktsiyaga qo'ng'iroq muvaffaqiyatli amalga oshirilsa, unda ushbu oqimning hisoblagichning oldingi qiymati qaytariladi, aks holda - 0xFFFFFFFF.
Bitta ipni bir necha marta to'xtatib turish mumkin (uni qayta tiklash kerak bo'lgan vaqtning aniq soni) va bu SuspendThread funktsiyasini chaqirish orqali amalga oshiriladi.
DWORD to'xtatib turishThread (
HANDLE hThread // to'xtatilishi kerak bo'lgan ip
);
Tizim protsessorga millisekundda ko'rsatilgan ma'lum vaqt berilmasligi uchun OTni xabardor qilishi mumkin.
VOID Kutish (DWORD MilliSeconds);
Windows 2000 / XP-da identifikator orqali oqimni topadigan va ochadigan funktsiya mavjud.
HANDLE OpenThread (
DWORD DesiredAccess,
BOOL InheritHandle,
DWORD dwTreadId
);
Do'stlaringiz bilan baham: |