„Rust“ pamoka: atminties saugumas ir lygiagretumas

Paskutiniai pakeitimai: 04/12/2025
Autorius: Izaokas
  • „Rūdžių“ technologija užtikrina atminties saugumą kompiliavimo metu per nuosavybės teisę, skolinimąsi ir atminties gyvavimo trukmę, nenaudojant šiukšlių surinkimo.
  • Tipų sistema ir aliasavimo taisyklės leidžia lygiagrečiai veikti be duomenų lenktynių naudojant mutexus, kanalus ir išmaniuosius rodykles.
  • „Cargo“, „crates.io“ ir aktyvi ekosistema supaprastina priklausomybių valdymą, kompiliavimą, testavimą ir diegimą.
  • Struktūrų, išvardijimų, „Option“ ir „Result“ supratimas yra labai svarbus norint tvarkyti klaidas ir modeliuoti saugius duomenis lygiagrečiose programose.

C programavimo kalba ir Rust: privalumai ir trūkumai

Rūdys tapo viena iš tų kalbų, kurios Kiekvienas sistemų kūrėjas tai girdi vėl ir vėl.Jis toks pat greitas kaip C ir C++, tačiau beveik obsesyviai orientuotas į atminties saugumą ir sklandų lygiagretumą. Tai ne tik tuščia rinkodara: jo dizainas sukasi apie tai, kad kompiliatorius aptiktų klaidas kompiliavimo metu – klaidas, kurios kitose kalbose matomos tik tada, kai sistema jau veikia gamyboje... arba kai ji sugenda.

Jei jus domina supratimas Kaip „Rust“ pasiekia saugią atmintį be šiukšlių rinkimo ir lygiagretumo, nebijant duomenų paleidimoŠis vadovėlis skirtas jums. Aptarsime viską – nuo ​​kalbos pagrindų ir jos ekosistemos iki pagrindinių sąvokų, tokių kaip nuosavybė, skolinimasis, sudėtiniai tipai, įrankiai, tokie kaip „Cargo“, ir netgi pažvelgsime į atominius tipus ir užrakinimą iš prieinamesnės perspektyvos tiems, kurie dar tik pradeda lygiagretumą, daugiausia dėmesio skirdami saugumui ir našumui.

„Rust“ pamoka: našumas, atminties saugumas ir lygiagretumas

Rust yra programavimo kalba programavimo bendrosios paskirties ir daugiaparadigminis, skirtas žemo lygio sistemų programavimui, taip pat ir aukšto lygio projektams, nuo operacines sistemasNuo žaidimų variklių ir naršyklių iki didelio našumo žiniatinklio paslaugų – jis atsirado „Mozilla“, siekiant pagerinti programinės įrangos saugumą, ypač jautriuose komponentuose, tokiuose kaip naršyklės variklis.

Jo skiriamasis bruožas yra tas, kad garantuoja atminties saugumą kompiliavimo metu nenaudojant šiukšlių surinkėjo. Vietoj to, „Rust“ naudoja nuosavybės sistemą ir skolinimosi tikrintuvą, kuris seka kiekvienos reikšmės ir jos nuorodų gyvavimo laiką. Taip išvengiama klasikinių problemų, tokių kaip kabančios rodyklės, buferio perpildymas ar atminties nutekėjimas, nereikalaujant automatinio nuorodų skaičiavimo ar šiukšlių surinkimo.

Be to, „Rust“ sukurta taip, kad būtų lengviau saugus lankymasJo tipo ir nuosavybės modelis apsaugo nuo duomenų lenktynių tarp gijų, bent jau išlaikant saugų „Rust“ kodą. Tai reiškia, kad daugelis pavojingų situacijų aptinkamos kompiliavimo metu, dar prieš įvykdant nė vieną eilutę.

Dėl visų šių priežasčių didelės įmonės, pvz. „Dropbox“, „Microsoft“, „Amazon“ arba "Google" Jie pritaikė „Rust“ svarbiausiose savo infrastruktūros dalyse. Ir neatsitiktinai ji jau daugelį metų pirmauja „Stack Overflow“ apklausose kaip viena iš kūrėjų „labiausiai mėgstamų“ kalbų: ji derina C++ stiliaus našumą su moderniu įrankių rinkiniu („Cargo“, „crates.io“) ir labai aktyvia bendruomene, vadinama „Rustaceans“.

Pagrindinės sąvokos: programavimo kalba, tipai ir atmintis

Prieš gilinantis į atminties saugumo ir lygiagretumo specifiką, verta išsiaiškinti kai kurias bendrąsias sąvokas, kurios pateikiamos visame dokumente. El Tiempo Dirbant su „Rust“, ypač jei esate iš kitų kalbų arba tik pradedate programuoti.

Programavimo kalba, galiausiai, yra taisyklių ir struktūrų rinkinys, leidžiantis aprašyti algoritmus ir transformuoti jas į vykdomąsias programas. „Rust“ kompiliuojasi į vietinį mašininį kodą naudodama savo kompiliatorių rustcTodėl gaunamas našumas paprastai yra toks pat kaip C ir C++.

Atminties valdymas yra procesas, kurio metu programa rezervuoja ir atlaisvina atminties blokus veikimo metuŠios srities klaidos dažnai būna lemtingos: atminties nutekėjimas (nepanaudotos atminties atlaisvinimas), duomenų sugadinimas dėl rašymo už ribų arba atminties naudojimo po to, kai ji jau atlaisvinta. „Rust“ šią problemą sprendžia labai stipria tipų sistema ir formaliomis taisyklėmis dėl nuosavybės, skolinimosi ir gyvavimo trukmės.

Rūdžių sudėtyje taip pat yra tokių terminų kaip išmanieji tipai ir rodyklėsTipas apibūdina, kokio tipo duomenis kintamasis saugo (sveikieji skaičiai, slankiojantys skaičiai, eilutės, struktūros ir kt.) ir kaip juos galima valdyti. Išmaniosios rodyklės (pavyzdžiui, Box, Rc y Arc) yra struktūros, kurios apima atminties adresus ir prideda papildomos logikos, kad būtų galima saugiai valdyti išteklius, pavyzdžiui, skaičiuoti bendras nuorodas arba perkelti reikšmes į kaupą.

Konkurencijos srityje tokios sąvokos kaip lenktynių sąlygos, mutexes ir kanalai Jie tampa nepakeičiami: lenktynių sąlyga atsiranda, kai kelios gijos vienu metu pasiekia ir modifikuoja bendrai naudojamą išteklių be tinkamo koordinavimo; mutex (abipusis išskyrimas) užtikrina, kad vienu metu į kritinę dalį patektų tik viena gija; o kanalai leidžia siųsti pranešimus tarp gijų tiesiogiai nesidalinant atmintimi.

Kodėl verta mokytis „Rust“: atminties saugumas ir bebaimis lygiagretumas

Rūdys pelnė savo šlovę, nes siūlo Trys labai vertingi šiuolaikinio programavimo ramsčiaiNašumas, saugumas ir dabartiniai įrankiai. Pažiūrėkime, kodėl šie punktai yra tokie aktualūs.

Kalbant apie našumą, Rust kompiliuojasi tiesiai į vietinius dvejetainius failus be virtualios mašinos ar interpretatoriaus poreikio. Nulinės kainos abstrakcijos modelis siekia užtikrinti, kad aukšto lygio abstrakcijos neprisidėtų prie papildomų sąnaudų vykdymo metu. Todėl jis idealiai tinka sistemų kūrimui. žaidimas, naršyklės komponentai arba mažo delsos mikropaslaugos.

Atminties saugumas grindžiamas tuo, kad nuosavybės ir paskolų sistemaŠiukšlių surinkėjo nėra, bet kompiliatorius tiksliai žino, kam priklauso kiekvienas išteklius, kada jo nebereikia ir kada jį galima atlaisvinti. Tai apsaugo nuo nutekėjimų, kabančių rodyklių ir daugelio klaidų, kurios tradiciškai C ir C++ programavimą laikė tokiu pavojingu.

Konkurencijos srityje Rust vykdo tai, kas paprastai vadinama „Susitikimas be baimės“Pati tipų sistema neleidžia duomenų šaknims egzistuoti saugiame kode. Jei norite dalytis keičiamais duomenimis tarp gijų, turėsite naudoti tinkamus primityvus, pvz. Mutex, RwLock o Arc, o kompiliatorius užtikrins, kad būtų laikomasi aliasavimo ir keitimo taisyklių.

  Kaip žingsnis po žingsnio dezinfekuoti „Windows“ naudojant „Malwarebytes“

Kūrimo patirtis pagerinama naudojant modernius įrankius, tokius kaip krovinysJame yra integruotas paketų tvarkyklė ir kūrimo infrastruktūra bei plati bibliotekų (dėžių) ekosistema, apimanti viską nuo asinchroninių tinklų (Tokyo) iki žiniatinklio karkasų (Actix, Rocket, Axum). Visa tai palaiko atvira, produktyvi ir gana kantri bendruomenė, ypač pradedantiesiems.

Montavimas ir būtini įrankiai: „Rustup“, „Rustc“ ir „Cargo“

Norėdami parašyti ir paleisti savo pirmąsias programas „Rust“ aplinkoje, įprastas būdas pradėti yra įdiegti oficialią įrankių grandinę naudojant surūdijimas (žr. Išsamus įvadas į Rust), paprastas diegimo ir versijų tvarkytuvas, veikiantis visose pagrindinėse operacinėse sistemose.

su surūdijimas Galite įdiegti, atnaujinti ir perjungti skirtingas „Rust“ versijas (stabilią, beta, naktinę) nieko nesugadindami. Tiesiog eikite į oficialų „Rust“ įrankių puslapį ir atlikite savo sistemai skirtus veiksmus. Įdiegus kompiliatorių, jis bus pasiekiamas. rustc, projekto vadovas cargo ir jo paties rustup Jūsų terminalas.

kompiliatorius rustc Tai, kas transformuoja jūsų šaltinio kodą į vykdomuosius dvejetainius failus arba bibliotekas. Nors galite jį iškviesti tiesiogiai naudodami komandos kaip rustc main.rsPraktiškai beveik visada dirbsite per „Cargo“, kuri tvarko skambučius į rustc su tinkamais variantais.

Centrinė darbo eigos priemonė yra krovinysVos keliomis komandomis galite kurti naujus projektus, valdyti priklausomybes, kompiliuoti, vykdyti, testuoti ir publikuoti paketus svetainėje crates.io. Kai kurios dažniausiai naudojamos pagrindinės komandos yra šios: cargo new, cargo build, cargo run, cargo test y cargo check, kuris tikrina kodą nesukurdamas galutinio vykdomojo failo, idealiai tinka greitai aptikti klaidas.

Jei norite pataisyti nieko neįdiegę, Rūdžių žaidimų aikštelė (oficialus internetinis vykdytojas) ir tokios platformos kaip „Replit“ leidžia rašyti ir vykdyti nedidelius kodo fragmentus iš naršyklės, puikiai tinka eksperimentuoti su atmintimi ir lygiagretumo pavyzdžiais, nereikia nustatyti visos aplinkos.

Jūsų pirmoji programa: Sveiki, Rust, ir pagrindinis srautas

Klasikinis būdas pradėti pokalbį bet kuria kalba yra garsusis „Sveikas, pasauli“. „Rust“ žaidime failas main.rs bent jau galėtų būti kažkas tokio paprasto kaip funkcija main kuris ekrane atspausdina eilutę.

Pagrindinis žodis fn rodo, kad apibrėžiame funkciją, ir main Tai yra programos įėjimo taškas. Funkcijos kodo blokas yra riestiniuose skliaustuose. Norėdami rašyti į konsolę, naudokite makro println!, kuris priima eilutės literalą (arba šabloną su žymėmis) ir siunčia jį į standartinę išvestį, pasibaigiančią naujos eilutės simboliu.

Jei kompiliuojate tiesiogiai su rustc main.rs, gausite vykdomąjį dvejetainį failą (pavyzdžiui, main o main.exe (priklausomai nuo sistemos). Paleidus programą, terminale matysite pranešimą. Tačiau idiomatiškas būdas dirbti su „Rust“ yra leisti „Cargo“ vadovauti projektui.

su cargo new nombre_proyecto Aplankų struktūra automatiškai sukuriama su src/main.rs jau paruoštas su „Sveikas, pasauli“ ir failu Cargo.toml kuriame yra metaduomenys ir būsimos priklausomybės. Nuo tada cargo run sukompiliuokite ir paleiskite dvejetainį failąir jis perkompiliuoja tik tada, kai aptinka pakeitimus.

Toks darbo būdas ne tik patogus, bet ir leidžia priprasti prie standartinės „Rust“ ekosistemos naudojimo nuo pat pradžių, o tai labai naudinga, kai pradedate pridėti dėžes lygiagrečiam darbui, tinklams, testavimui ar kitiems reikalingiems dalykams.

// Deklaruojame pagrindinę funkciją: programos įėjimo taškas fn main() { // Naudojame println! makrokomandą, kad atspausdintume tekstą į konsolę println!("Sveikas, pasauli!"); }

Kintamieji, kintamumas ir pagrindiniai duomenų tipai

„Rust“ kalboje kintamieji deklaruojami su raktiniu žodžiu letir pagal numatytuosius nustatymus yra nekintamiKitaip tariant, priskyrus jiems vertę, jų negalima modifikuoti, nebent aiškiai deklaruojate juos kaip keičiamus su mut.

Numatytasis nekintamumas padeda išvengti subtilių loginių klaidų, ypač lygiagrečiose programose, kuriose kelios gijos gali norėti pakeisti tą pačią reikšmę. Jei reikia ją pakeisti, rašote kažką panašaus į let mut contador = 0;Iš ten galite priskirti naujas vertes contador.

Rūdys taip pat leidžia vadinamąjį šešėliaiGalite deklaruoti naują kintamąjį tuo pačiu pavadinimu toje pačioje srityje, paslėpdami ankstesnį. Tai nėra tas pats, kas mutavimas, nes kuriate naują reikšmę (kuri gali būti net kitokio tipo). Pavyzdžiui, galite konvertuoti iš eilutės į sveikąjį skaičių naudodami tą patį pavadinimą, jei tai yra nauja deklaracija su let.

„Rust“ tipų sistema yra statinė, o tai reiškia, kad Kiekvieno kintamojo tipas žinomas kompiliavimo metu.Tačiau tipo nustatymas yra gana galingas: jei rašote let x = 5;Kompiliatorius daro prielaidą, kad tai yra i32 Nebent nurodėte kitaip. Galite pridėti pastabų, pvz. let x: i64 = 5; kai norisi būti atviram.

Tarp galimų skaliarų tipų yra sveikieji skaičiai su ženklu ir be ženklo (i8, u8, i32ir kt.), plaukiojantys (f32, f64), Būlio operatoriai (bool) ir Unicode simboliai (char). Šiuos paprastus tipus paprastai pigu nukopijuoti ir daugelis juos įgyvendina. CopyTai reiškia, kad kai juos priskiriate arba perduodate funkcijai, jie nukopijuojami, o ne perkeliami.

Stygos Rust kalboje: &str ir String

Teksto tvarkymas „Rust“ programoje iš pradžių gali būti šiek tiek painus, nes ji aiškiai skiria grandinės „gabalėliai“ ir patentuotos grandinėsDu pagrindiniai elementai yra &str y String.

Un &str yra nekintamos grandinės gabalasKažkur saugomos UTF-8 baitų sekos vaizdas. Tipiniai pavyzdžiai: literalai, tokie kaip "Hola"kurie yra tokio tipo &'static str (Jie egzistuoja visą programos gyvavimo laiką ir yra įterpti į dvejetainį failą.) Slices nepriklauso duomenims; jos tik nurodo į juos.

  Kaip kruopščiai pritaikyti užduočių juostą sistemoje „Windows 11“: išsamus vadovas ir išsamūs patarimai

String, kita vertus, yra nuosava eilutė, keičiama ir talpinama krūvojeJo dydį galima keisti, sujungti, perduoti tarp funkcijų perkeliant jo savybę ir pan. Jis dažnai naudojamas, kai norite kurti dinaminį tekstą arba jį ilgam laikui saugoti struktūrose.

Daugeliu atvejų jūs pereisite nuo vieno prie kito: pavyzdžiui, sukursite String::from("hola") iš gabalėlioarba jūs pasiskolinsite. &str pagal String perduodant nuorodas į funkcijas, kurias reikia tik skaityti.

Šis atskyrimas tarp nuosavų ir pasiskolintų duomenų yra labai svarbus atminties valdymui ir apima visą likusią kalbos dalį: rinkiniai, struktūros ir sąrašai vadovaujasi tomis pačiomis idėjomis, kam priklauso ir kas tik peržiūri.

Funkcijos, valdymo srautas ir komentarai

Rust funkcijos apibrėžiamos su fn ir leisti programą organizuoti į pakartotinai naudojamus loginius vienetus. Kiekviena funkcija nurodo jo parametrų tipas ir grąžinimo tipas sekant rodyklę ->Jei negrąžinama nieko reikšmingo, laikoma, kad tai vienetinis tipas. ().

Svarbi detalė yra ta, kad paskutinė funkcijos (ar bet kurio bloko) išraiška be kabliataškio laikoma numanoma grąžinama reikšme. Galite naudoti return ankstyvam grąžinimuiTačiau idiomatiniame kode dažnai tiesiog paliekama galutinė išraiška be jos. ;.

Valdymo srautas tvarkomas naudojant klasikinius metodus if/elsekilpos loop, while y forRūdyje, if Tai išraiška, kuri grąžina reikšmętodėl galite jį naudoti tiesiogiai letsu sąlyga, kad šakos grąžina tą patį tipą. Ciklai for Paprastai jie iteruoja per diapazonus arba kolekcijų iteratorius ir yra rekomenduojamas pasirinkimas vietoj rankinių indeksų.

Norėdami dokumentuoti kodą ir palengvinti gyvenimą visiems, kurie ateis po jo (įskaitant ir save po mėnesio), galite naudoti eilutės komentarai su // arba blokuoti su /* ... */Be to, „Rust“ siūlo dokumentacijos komentarus su /// kurie tampa sugeneruotais dokumentais, nors tai labiau tinka dideliems projektams.

Nuosavybė, skolinimas ir gyvenimas: atminties saugumo pagrindas

Čia prieiname prie Rusto atminties modelio esmės: sistemos nuosavybė, skolinimasis ir gyvenimo trukmėŠios taisyklės užtikrina, kad nuorodos visada galioja ir atmintis saugiai atlaisvinama be susikaupusių šiukšlių.

Pagrindinės nuosavybės taisyklės yra paprastos, nors iš pradžių jas gali būti sunku įsisavinti: Kiekviena vertė turi vieną savininką.Vienu metu gali būti tik vienas savininkas; ir kai savininkas palieka savo veikimo sritį, reikšmė sunaikinama ir jos atmintis išlaisvinama. Tai taikoma, pavyzdžiui, String: užbaigus bloką, kuriame jis buvo deklaruotas, jis automatiškai iškviečiamas drop kuris atlaisvina kaupikinę atmintį.

Kai priskiriate tinkamą reikšmę kitam kintamajam arba perduodate jį pagal reikšmę funkcijai, savybė perkeliama. Tai reiškia, kad pradinis kintamasis nustoja galioti po perkėlimoŠi judėjimo semantika leidžia išvengti dvigubų leidimų, nes niekada nebūna dviejų savininkų, bandančių išleisti tą patį išteklių.

Kad kelios programos dalys galėtų pasiekti tą pačią reikšmę nekeisdamos nuosavybės, „Rust“ įveda nuorodas ir skolinimąsi. Skolinantis sukuriate nuorodą. &T (nekintamas) arba &mut T (keičiama) į reikšmę neperduodant nuosavybės teisės. Paskolą riboja paskolos tikrintojo taisyklės., kuris tikrina, ar nuorodos negyvena ilgiau nei duomenys, į kuriuos jos nurodo, ir ar keičiamos bei bendros prieigos nėra pavojingai sumaišytos.

Paskolos taisykles galima apibendrinti taip: bet kuriuo metu galite turėti kelios nekintamos nuorodos iki vertės arba viena kintama nuorodaBet ne abu vienu metu. Tai pašalina lenktynių sąlygas bendroje atmintyje: arba yra daug skaitytojų, arba yra izoliuotas rašytojas; niekada nebūna vienu metu skaitančių ir rašančių tuos pačius duomenis tuo pačiu metu.

Sudėtiniai tipai: struktūros, sąrašai ir išmanieji rodyklės

„Rust“ siūlo kelis būdus, kaip grupuoti susijusius duomenis į turtingesnes struktūras, pradedant nuo struktūrosStruktūra leidžia apibrėžti pasirinktinį tipą su pavadintais laukais, pavyzdžiui, vartotoją su el. pašto adresu, vardu, aktyvumo būsena ir prisijungimų skaitikliu.

Norėdami sukurti struktūros egzempliorių, užpildote visus jo laukus ir galite pažymėti kintamąjį, kuriame jis yra, kaip keičiamą, kad vėliau galėtumėte modifikuoti jo reikšmes. Taip pat yra struktūros atnaujinimo sintaksė, leidžianti sukurti naują egzempliorių pakartotinai panaudojant kai kuriuos esamo laukus. ..otro_struct.

Los išvardijimų Jie yra dar vienas esminis ramstis: jie leidžia apibrėžti tipą, kuris gali būti vienas iš kelių galimų variantų, kiekvienas su savo susijusiais duomenimis arba be jų. Klasikinis pavyzdys yra IP adresų išvardijimas su vienu variantu. V4 kuriame saugomi keturi oktetai ir dar vienas V6 kurioje saugoma eilutė su IPv6 notacija.

Standartinėje „Rust“ bibliotekoje yra du labai svarbūs sąrašai (enum): Option<T> y Result<T, E>Pirmasis žymi reikšmės (kažko arba nieko) buvimą arba nebuvimą ir yra naudojamas siekiant išvengti nulinių rodyklių; antrasis modeliuoja operacijas, kurios gali grąžinti teisingą rezultatą arba klaidą, reikalaujant, kad klaidų tvarkymas būtų aiškus ir saugus.

Norėdama valdyti dinaminę atmintį ir bendrinti duomenis, „Rust“ turi išmaniosios rodyklės kaip Box<T>, kuris perkelia reikšmę į kaupą ir išlaiko unikalią nuosavybę; Rc<T>, bendras nuorodų skaičius vienos gijos aplinkose; ir Arc<T>, panašus į Rc bet saugus keliems siūlams. Teisingas jų naudojimas yra labai svarbus derinant dinaminę atmintį su lygiagrečiu veikimu.

Krovinių ir dėžių ekosistema

Krovinys yra klijai, laikantys „Rust“ ekosistemą kartu: valdo kompiliavimą, priklausomybes ir projekto gyvavimo cikląKiekvienas projektas turi failą Cargo.toml kuris veikia kaip manifestas, deklaruojantis pavadinimą, versiją, kalbos leidimą ir išorines priklausomybes.

  Ištaisyta: „Windows 10“ vidinė PCI magistralės tvarkyklės klaida

Skyrius Šis failas leidžia jums pateikti trečiųjų šalių dėžių sąrašą su jų versijomis. Paleidus cargo build o cargo run„Cargo“ automatiškai atsisiunčia šias dėžes iš crates.io, jas sukompiliuoja ir susieja su jūsų projektu. Taip paprasta pridėti, pavyzdžiui, atsitiktinių skaičių generatorius, žiniatinklio sistemas ar kriptografines bibliotekas.

Tarp dažniausiai pasitaikančių komandų yra cargo new pradėti dvejetainius projektus o cargo new --lib bibliotekoms; cargo build kompiliuoti derinimo režimu; cargo build --release gauti optimizuotą, gamybai skirtą versiją; ir cargo test atlikti testų seriją.

cargo check Jis nusipelno ypatingo paminėjimo: jis sukompiliuoja kodą iki tarpinio taško negeneruodamas dvejetainio failo, todėl jį galima labai greitai aptikti kompiliavimo klaidasTai puikiai tinka greitam iteravimui, o skolinimosi tikrintuvas nurodo problemas, susijusias su savybėmis, nuorodomis ir gyvavimo trukme.

Dėl šios ekosistemos įprasta projektus struktūrizuoti kaip mažas, aiškiai apibrėžtas dėžes, tarp jų dalijantis kodu ir pakartotinai naudojant bendruomenės sukurtus sprendimus. Pavyzdžiui, pažangiam lygiagrečiam programavimui turėsite tokias dėžes kaip „Tokio“, skirtas asinchroniniam programavimui, arba „crossbeam“, skirtas didelio našumo lygiagrečioms duomenų struktūroms.

Lygiagretumas Rust kalboje: gijos, mutexes, kanalai ir atomai

Lygiagretumas yra viena iš priežasčių, kodėl „Rust“ sulaukia tokio didelio susidomėjimo: jis leidžia pasinaudoti kelių branduolių procesorių privalumais. nepakliūjant į tipines gijų ir bendros atminties klaidasJei šias temas nagrinėjate pirmą kartą, naudinga atskirti kelias sąvokas.

Lygiagretus vykdymas apima kelių užduočių, kurios sutampa laike, vykdymą viename arba keliuose branduoliuose. „Rust“ sistemoje galite kurti sistemos gijas, kad jos atliktų darbą lygiagrečiai, o kalba padeda užtikrinti, kad duomenų bendrinimas tarp jų būtų saugus. Klasikinė klaida yra lenktynių sąlyga, kai dvi gijos vienu metu pasiekia ir modifikuoja duomenis, o rezultatas priklauso nuo vykdymo tvarkos – tai labai sunku derinti.

Norėdama koordinuoti prieigą prie bendrinamų duomenų, „Rust“ remiasi tokiais primityvais kaip mutexkurios garantuoja abipusį atmetimą: į kritinę sekciją vienu metu gali patekti tik vienas siūlas. Kartu su Arc<T> Norint pasidalyti nuosavybe tarp gijų, galima kurti bendras duomenų struktūras, kurios atitinka nuosavybės ir skolinimosi taisykles.

Kita įprasta tarpsrieginio bendravimo forma, kurią „Rust“ labai skatina, yra pranešimų perdavimas naudojant kanalaiKanalas turi siuntimo ir priėmimo galus; gijos perduoda pranešimus (reikšmes) per jį, o tai sumažina keičiamos bendros atminties naudojimą ir supaprastina sistemos būsenos samprotavimus.

Giliau panagrinėjus žemo lygio lygiagretumą, matome: atomų tipaiAtominiai kintamieji pasiekiami operacijomis, kurios yra nedalomos iš gijos perspektyvos. Tai leidžia įdiegti bendrus skaitiklius, būsenos vėliavėles, eiles be užraktų ir kt. Norint įvaldyti atominius kintamuosius, reikia suprasti atminties modelius ir prieigos komandas, todėl daugelis kūrėjų renkasi pradėti nuo mutacijų ir kanalų, prieš gilindamiesi į šias detales.

Pirmieji žingsniai ir ištekliai mokantis lygiagretumo ir atomų

Jei įžengiate į areną neturėdami jokios ankstesnės patirties, išmintingiausias veiksmas yra sukurti tvirtą bendrų sąvokų pagrindą prieš pradedant taikyti pažangius įrankius, tokius kaip „Rust“ atomų tipai. Tokiose knygose kaip „Rust programavimas“ pateikiamas laipsniškas įvadas, tačiau normalu, kad darbai, skirti atomų tipams ir užraktams, iš pradžių atrodo sudėtingi.

Siekiant didesnio patogumo, patartina pirmiausia susipažinti su Tradiciniai siūlai, abipusis atmetimas ir pranešimų perdavimas Rust. Pažaiskite su pavyzdžiais std::thread, std::sync::Mutex, std::sync::Arc ir kanalai std::sync::mpsc Tai padeda suprasti, kaip kompiliatorius jus veda ir kokių klaidų jis išvengia.

Lygiagrečiai labai rekomenduojama peržiūrėti įvadinius išteklius apie lygiagretumą apskritai, net jei jie nėra skirti „Rust“: suprasti, kas yra lenktynių sąlygos, ką reiškia blokavimas, ką reiškia bendra atmintis, palyginti su pranešimų perdavimu, ir kaip naudojami užraktai. Kai šios sąvokos jums taps natūralios, atominė fizika nustos būti „juodąja magija“. ir jie tampa tik dar vienu įrankiu, tik labai subtiliu.

Grįžus prie sudėtingesnių tekstų apie atomus ir užraktus „Rust“ kalboje, bus daug lengviau sekti samprotavimus, jei jau suprasite, kokią problemą bando išspręsti kiekviena konstrukcija: nuo paprasto, gijoms saugaus skaitiklio iki struktūrų be užraktų, kurios sumažina ginčus.

Galiausiai „Rust“ siūlo tiek aukšto lygio primityvus, tiek labai žemo lygio įrankius, o svarbiausia visada pasirinkti saugiausią abstrakcijos lygį, kuris išsprendžia jūsų problemą, pasitelkiant atominį kodą. unsafe tik tada, kai tai iš tiesų prideda vertės ir jūs visiškai suprantate jo pasekmes.

Visa ši tipų, nuosavybės, skolinimosi, dėžių, įrankių ir lygiagrečių primityvų ekosistema susijungia ir sukuria kalbą, kuria galima rašyti. greita, patikima ir prižiūrima programinė įrangaTai sumažina daugelio tipų klaidas, kurios istoriškai kamavo sistemų programavimą. Praktikuojant mažus projektus, tokius pratimus kaip „Rustlings“ ir oficialią dokumentaciją, šios sąvokos iš atrodytų griežtų taisyklių taps sąjungininku, įspėjančiu jus, kol problema nepasiekė gamybos etapo.

Įvadas į Rust kalbą su pavyzdžiais-0
Susijęs straipsnis:
Išsamus įvadas į rūdis: praktinis pradedančiųjų vadovas su pavyzdžiais