Да бисте разумели навоје у ВБ.НЕТ-у, помаже вам да разумете неке од темељних концепата. Прво је да се навојем нешто догоди јер га оперативни систем подржава. Мицрософт Виндовс је превасходни оперативни систем за више задатака. Део Виндовса који се зове алат за планирање задатака одваја време процесора свим покретаним програмима. Ови мали комади времена процесора називају се одељци времена. Програми нису одговорни за време процесора које добијају, распоред задатака. Будући да су ови временски одсеци тако мали, добивате илузију да рачунар ради неколико ствари одједном.
Дефиниција теме
Навој је један секвенцијални ток контроле.
Неки квалификатори:
- Конац је "пут извршења" кроз то тело кода.
- Нити дијеле меморију тако да морају сарађивати како би постигли тачан резултат.
- Конац има податке специфичне за нит, попут регистара, показивача снопа и бројача програма.
- Процес је једно тело кода које може имати више нити, али има барем један и има један контекст (адресни простор).
Ово су ствари на нивоу монтаже, али то је оно што имате када почнете размишљати о нитима.
Мултитхреадинг вс. Вишеструка обрада
Мултитхреадинг није исто што и вишеструка паралелна обрада, али мултитхреадинг и мултипроцесирање раде заједно. Већина ПЦ рачунара данас има процесоре који имају најмање две језгре, а обичне кућне машине понекад имају и до осам језгара. Свако језгро је засебан процесор, способан да сам покреће програме. Повећавате перформансе када ОС додијели различит процес различитим језграма. Употреба више нити и више процесора за још веће перформансе назива се паралелизам на нивоу нити.
Много тога што се може учинити зависи од тога шта оперативни систем и процесор хардвер могу да ураде, а не увек шта можете да урадите у свом програму и не треба очекивати да ћете моћи да користите више нити на њему све. У ствари, можда нећете наћи много проблема који имају користи од више нити. Дакле, немојте имплементирати мултитхреадинг само зато што је тамо. Можете лако смањити перформансе вашег програма ако није добар кандидат за мултитхреадинг. Као примери, видео кодеци су можда најгори програми за мултитреадање, јер су подаци инхерентни серијски. Серверски програми који обрађују веб странице можда су међу најбољима јер су различити клијенти сами по себи независни.
Вежбање сигурности навоја
Мултитхреадед кода често захтева сложену координацију нити. Суптилне и тешко пронађене грешке су честе јер различите нити често морају дијелити исте податке како би подаци могли да се мијењају једним нити када га други не очекује. Општи израз за овај проблем је "стање трке". Другим речима, две нити могу ући у „трку“ ради ажурирања истих података и резултат може бити различит у зависности од тога која нит „побеђује“. Као тривијални пример, претпоставимо да кодирате петљу:
Ако бројач петље "И" неочекивано пропусти број 7 и крене са 6 на 8 - али само у неким случајевима - то би имало катастрофалне ефекте на све што петља ради. Спречавање оваквих проблема назива се безбедност навоја. Ако је програму потребан резултат једне операције у каснијој операцији, тада може бити немогуће да кодира паралелне процесе или нити да би то урадио.
Основне операције са вишеструким навојем
Време је да овај разговор из предострожности потиснете у позадину и напишете неки мултитхреадинг код. Овај чланак тренутно користи једноставну апликацију за једноставност. Ако желите да наставите даље, покрените Висуал Студио с новим пројектом Конзоле апликација.
Примарни простор имена који користи мултитхреадинг је Систем. Простор имена и класа Тхреад створиће, покреће и зауставља нове теме. У доњем примеру примјетите да је ТестМултиТхреадинг делегат. Односно, морате користити име методе која метода Тхреад може позвати.
У овој апликацији могли смо извршити други Суб, тако да га једноставно позовемо:
Ово би читаву апликацију извршило серијски. Први горњи пример кода, међутим, покреће потпрограм ТестМултиТхреадинг и затим наставља.
Пример рекурзивног алгоритма
Ево мултитхреадед апликације која укључује израчунавање пермутација низа користећи рекурзивни алгоритам. Овде није приказан сав код. Низ знакова који се пермутирају је једноставно "1", "2", "3", "4" и "5." Ево одговарајућег дела кода.
Имајте на уму да постоје два начина за позивање Пермуте суб (оба коментарисана у коду горе). Један започиње нит, а други га директно позива. Ако га директно позовете, добићете:
Међутим, ако започнете нит, а уместо тога покренете подмени Пермуте, добићете:
То јасно показује да је генерисана најмање једна пермутација, а затим се главни подметак креће напред и завршава, приказујући "Готово главно", док се остале пермутације генеришу. Пошто дисплеј долази из другог поткопа који се зове Пермуте суб, знате да је и он део нове нити. Ово илуструје концепт да је нит "пут извршења" као што је раније поменуто.
Пример стања трке
Први део овог чланка поменуо је стање трке. Ево примера који то директно показује:
Непосредни прозор показао је овај резултат у једном испитивању. Остала испитивања су била различита. То је суштина стања трке.