Схватите Рустов приступ истовремености који је заснован на концепту „неустрашиве истовремености“.
Конкурентност је способност програма да изврши више задатака истовремено на истом ЦПУ језгру. Истовремени задаци се покрећу и завршавају у времену које се преклапа без одређеног редоследа, за разлику од паралелизма, где се различити задаци или подзадаци истог задатка покрећу у исто време на хардверу са више процесори.
Руст се истиче по својим карактеристикама перформанси и подршци за истовременост на безбедан и ефикасан начин. Рустов приступ истовремености заснива се на концепту „неустрашиве истовремености“ где језик има за циљ да олакша писање безбедним истовремени код кроз свој систем власништва и позајмљивања који примењује строга правила у време компајлирања како би спречио трагове података и обезбедио меморију сигурност.
Разумевање конкурентности у Руст-у
Руст обезбеђује неколико паралелних примитива за писање истовремених програма, укључујући нити, прослеђивање порука, мутексе, атомске типове и асинц/аваит за асинхроно програмирање.
Ево прегледа Рустових паралелних примитива:
- Тхреадс: Руст обезбеђује а стд:: тхреад модул у својој стандардној библиотеци за креирање и управљање нитима. Можете покренути нове теме помоћу тхреад:: спавн функција. Тхе тхреад:: спавн узима затварање које садржи код за извршење. Такође можете покренути нити које могу да се покрећу паралелно, а Руст обезбеђује примитиве за синхронизацију за координацију њиховог извршавања. Провера позајмица осигурава да референце не доводе до неочекиваног понашања.
- Мессаге Пассинг: Рустов модел конкурентности подржава преношење порука између нити. Користићете канале имплементиране кроз стд:: синц:: мпсц модул за прослеђивање порука. Канал се састоји од предајника (Сендер) и пријемник (Пријемник). Нити могу слати поруке преко предајника и примати их преко пријемника. Ово обезбеђује сигуран и синхронизован начин комуникације између нити.
- Мутекси и атомски типови: Руст обезбеђује примитиве за синхронизацију, укључујући мутексе (стд:: синц:: Мутек) и атомски типови (стд:: синц:: атомиц), како би се осигурао ексклузивни приступ за дељење података. Мутекси омогућавају да више нити истовремено приступа подацима док спречавају трке података. Атомски типови обезбеђују атомске операције на дељеним подацима, као што је повећање бројача, без захтевања експлицитног закључавања.
- Асинц/Аваит и Футурес: Руст'с асинц/чекати синтакса пружа функционалност за писање асинхроног кода који можете да извршавате истовремено. Асинхрони програми ефикасно се баве задацима везаним за У/И омогућавајући програмима да извршавају друге задатке док чекају друге И/О операције. Руст'с асинц/чекати синтакса је заснована на будућности, а можете их покретати помоћу асинц-стд или токио рунтиме библиотеке.
Навоји од рђе су лагани, а одсуство додатних трошкова током рада чини их погодним за апликације високих перформанси. Рустови паралелни примитиви се неприметно интегришу са више библиотека и оквира за различите потребе истовремености.
Како користити Спавн Тхреадс у Русту
Користићете стд:: тхреад модул за покретање нити. Тхе стд:: тхреад:: спавн функција вам омогућава да креирате нову нит која ће се покретати истовремено са главном нити или било којом другом постојећом нити у вашем програму.
Ево како можете да покренете нит са стд:: тхреад:: спавн функција:
користити стд:: тхреад;
фнглавни() {
// Покрени нову нит
дозволити тхреад_хандле = тхреад:: спавн(|| {
// Код који се извршава у новој нити иде овде
принтлн!("Здраво из нове теме!");
});// Сачекајте да се покренута нит заврши
тхреад_хандле.јоин().унврап();
// Код који се извршава у главној нити се наставља овде
принтлн!("Здраво из главне теме!");
}
Тхе главни функција креира нову нит са тхреад:: спавн функцију преношењем затварања које садржи код за извршење у нити (у овом случају, затварање је анонимна функција). Затварање штампа поруку која указује да је нова нит покренута.
Тхе придружити метода на тхреад_хандле дозвољава главној нити да сачека да се покренута нит заврши извршавање. Позивањем придружити, функција осигурава да главна нит чека да се покренута нит заврши пре него што настави.
Можете покренути више нити и користити петљу или било коју другу Структура за контролу рђе за креирање више затварања и покретања нити за сваку.
користити стд:: тхреад;
фнглавни() {
дозволити нум_тхреадс = 5;дозволитимут тхреад_хандлес = вец![];
за и ин0..нум_тхреадс {
дозволити тхреад_хандле = тхреад:: спавн(потез || {
принтлн!(„Здраво из теме {}“, и);
});
тхреад_хандлес.пусх (тхреад_хандле);
}за ручка ин тхреад_хандлес {
хандле.јоин().унврап();
}
принтлн!("Све теме су завршене!");
}
Петља фор покреће пет нити, од којих је свака додељена јединственом идентификатору и са променљивом петље. Затварачи обухватају вредност и са потез кључна реч коју треба избегавати питања власништва, анд тхе тхреад_хандлес вектор складишти нити за касније у придружити петља.
Након покретања свих нити, главни функција итерира преко тхреад_хандлес вектор, позиви придружити на сваком ручку и чека да се изврше све нити.
Преношење порука кроз канале
Можете прослеђивати поруке кроз нити са каналима. Руст пружа функционалност за прослеђивање порука у стд:: синц:: мпсц модул. овде, мпсц означава „вишеструки произвођач, један потрошач“ и омогућава комуникацију између више нити слањем и примањем порука путем канала.
Ево како имплементирате пролазак порука кроз канале комуникације између нити у својим програмима:
користити стд:: синц:: мпсц;
користити стд:: тхреад;фнглавни() {
// Креирајте канал
дозволити (пошиљалац, прималац) = мпсц:: канал();// Спавн а тхреад
тхреад:: спавн(потез || {
// Пошаљите поруку преко канала
сендер.сенд("Здраво из теме!").унврап();
});
// Примите поруку у главној нити
дозволити примљена_порука = рецеивер.рецв().унврап();
принтлн!(„Примљена порука: {}“, примљена_порука);
}
Тхе главни функција креира канал са мпсц:: канал() који враћа а пошиљалац и а пријемник. Тхе пошиљалац шаље поруке на пријемник који прима поруке. Тхе главни функција наставља да покреће нити и помера власништво над Сендер до затварања конца. Унутар затварача навоја, сендер.сенд() функција шаље поруку преко канала.
Тхе рецеивер.рецв() функција прима поруку заустављањем извршавања док нит не прими поруку. Тхе главни функција штампа поруку на конзоли након успешног пријема поруке.
Имајте на уму да слање поруке преко канала троши пошиљаоца. Ако треба да шаљете поруке из више нити, можете клонирати пошиљаоца помоћу сендер.цлоне() функција.
Поред тога, тхе мпсц модул пружа друге методе као што су три_рецв(), који без блокирања покушава да прими поруку, и итер(), који креира итератор над примљеним порукама.
Преношење порука путем канала пружа безбедан и згодан начин за комуникацију између нити уз избегавање трка података и обезбеђивање правилне синхронизације.
Рустов модел власништва и позајмљивања гарантује безбедност меморије
Руст комбинује власништво, позајмљивање и проверу задуживања да би обезбедио робустан, безбедан оквир за истовремени програмирање.
Провера позајмице делује као сигурносна мрежа, откривајући потенцијалне проблеме у време компајлирања уместо да се ослања на провере времена извршавања или сакупљање смећа.