Supraskite Rust požiūrį į lygiagretumą, pagrįstą „bebaimiško lygiagretumo“ sąvoka.

Lygiagretumas yra programos galimybė vienu metu atlikti kelias užduotis tame pačiame procesoriaus branduolyje. Lygiagrečios užduotys vykdomos ir užbaigiamos persidengiant be nurodytos tvarkos, kitaip nei lygiagretumas, kai įvairios tos pačios užduoties užduotys arba papildomos užduotys vykdomos tuo pačiu metu aparatinėje įrangoje su keliomis procesoriai.

Rust išsiskiria savo našumo savybėmis ir saugiu bei efektyviu lygiagretumo palaikymu. Rust požiūris į lygiagretumą yra pagrįstas „bebaimiško lygiagretumo“ sąvoka, kai kalba siekiama, kad būtų lengva rašyti saugiai. vienu metu naudojamas kodas per nuosavybės ir skolinimosi sistemą, kuri kompiliavimo metu užtikrina griežtas taisykles, kad būtų išvengta duomenų pėdsakų ir užtikrinama atmintis saugumo.

Supratimas lygiagrečiai rūdyje

Rust pateikia keletą lygiagrečių primityvų, skirtų rašyti lygiagrečias programas, įskaitant gijas, pranešimų perdavimą, mutexes, atominius tipus ir asinchroninį / laukimą asinchroniniam programavimui.

instagram viewer

Štai Rusto lygiagretumo primityvų apžvalga:

  1. Siūlai: Rust suteikia a std:: siūlas modulį savo standartinėje bibliotekoje, skirtą gijų kūrimui ir tvarkymui. Galite sukurti naujų gijų naudodami gija:: neršti funkcija. The gija:: neršti paima uždarymą, kuriame yra vykdymo kodas. Taip pat galite paleisti gijas, kurios gali veikti lygiagrečiai, o Rust pateikia sinchronizavimo primityvus, kad koordinuotų jų vykdymą. Skolinimosi tikrintuvas užtikrina, kad nuorodos nesukeltų netikėto elgesio.
  2. Pranešimas perduodamas: Rust lygiagretumo modelis palaiko pranešimų perdavimą tarp gijų. Naudosite kanalus, įdiegtus per std:: sinchronizavimas:: mpsc pranešimų perdavimo modulis. Kanalas susideda iš siųstuvo (Siuntėjas) ir imtuvas (Imtuvas). Gijos gali siųsti pranešimus per siųstuvą ir priimti juos per imtuvą. Tai užtikrina saugų ir sinchronizuotą ryšį tarp gijų.
  3. Muteksai ir atomų tipai: Rust suteikia sinchronizavimo primityvus, įskaitant mutexes (std:: sinchronizavimas:: Mutex) ir atominiai tipai (std:: sinchronizavimas:: atominis), siekiant užtikrinti išskirtinę prieigą prie duomenų dalijimosi. Mutexes leidžia kelioms gijomis pasiekti duomenis vienu metu, tuo pačiu užkertant kelią duomenų lenktynėms. Atominiai tipai suteikia atomines operacijas su bendrinamais duomenimis, pvz., skaitiklio didinimą, nereikalaujant aiškaus užrakinimo.
  4. Asinchronizavimas / laukimas ir ateities sandoriai: Rūdžių async/laukti sintaksė suteikia galimybę rašyti asinchroninį kodą, kurį galite vykdyti vienu metu. Asinchroninės programos efektyviai susidoroja su I/O susietomis užduotimis, leidžiančiomis programoms atlikti kitas užduotis laukiant kitų I/O operacijų. Rūdžių async/laukti sintaksė yra pagrįsta ateities sandoriais, ir jūs galite juos maitinti naudodami async-std arba tokio vykdymo bibliotekos.

Rūdžių siūlai yra lengvi, o nesant eksploatavimo laiko viršutinių išlaidų, jie puikiai tinka didelio našumo programoms. „Rust“ lygiagretumo primityvai sklandžiai integruojami su keliomis bibliotekomis ir sistemomis skirtingiems lygiagretumo poreikiams.

Kaip naudoti spawn siūlus rūdyje

Jūs naudosite std:: siūlas modulis siūlams kurti. The std:: gija:: neršti Funkcija leidžia sukurti naują giją, kuri veiks kartu su pagrindine gija arba bet kuria kita esama jūsų programos gija.

Štai kaip galite sukurti giją su std:: gija:: neršti funkcija:

naudoti std:: sriegis;

fnpagrindinis() {
// Sukurti naują giją
leisti gijos_rankena = gija:: spawn(|| {
// Naujoje gijoje įvykdytas kodas eina čia
println!("Sveiki iš naujos temos!");
});

// Palaukite, kol baigsis sukurtas siūlas
thread_handle.join().unwrap();

// Pagrindinėje gijoje vykdomas kodas tęsiasi čia
println!("Sveiki iš pagrindinės temos!");
}

The pagrindinis funkcija sukuria naują giją su gija:: neršti funkciją, perduodant uždarymą, kuriame yra vykdymo kodas gijoje (šiuo atveju uždarymas yra anoniminė funkcija). Uždarymas išspausdina pranešimą, nurodantį, kad veikia nauja gija.

The prisijungti metodas ant siūlų_rankena leidžia pagrindinei gijai palaukti, kol sukurta gija baigs vykdyti. Paskambinus prisijungti, funkcija užtikrina, kad pagrindinė gija prieš tęsdama lauktų, kol sukurta gija bus baigta.

Galite sukurti keletą gijų ir naudoti kilpą ar bet kurį kitą Rūdžių kontrolės struktūra sukurti kelis uždarymus ir kiekvienam sukurti gijas.

naudoti std:: sriegis;

fnpagrindinis() {
leisti gijų_skaičius = 5;

leistimut siūlų_rankenos = vec![];

dėl i in0..gijų_skaičius {
leisti thread_handle = gija:: spawn(judėti || {
println!("Sveiki iš gijos {}", i);
});
gijos_rankenos.push (sriegio_rankena);
}

dėl rankena in thread_handles {
rankena.join().unwrap();
}

println!("Visos gijos baigtos!");
}

For kilpa sukuria penkias gijas, kurių kiekviena priskiriama unikaliam identifikatoriui i su ciklo kintamuoju. Uždarymai užfiksuoja vertę i su judėti raktažodis, kurio reikia vengti nuosavybės klausimai, ir siūlų_rankenos vektorius išsaugo gijas vėliau prisijungti kilpa.

Išneršus visus siūlus, pagrindinis funkcija kartojasi per siūlų_rankenos vektorius, skambučiai prisijungti ant kiekvienos rankenos ir laukia, kol bus įvykdytos visos gijos.

Pranešimų perdavimas per kanalus

Galite perduoti pranešimus per gijas su kanalais. Rust suteikia pranešimų perdavimo funkciją std:: sinchronizavimas:: mpsc modulis. Čia mpsc reiškia „keli gamintojai, vienas vartotojas“ ir leidžia bendrauti tarp kelių gijų siunčiant ir gaunant pranešimus kanalais.

Štai kaip savo programose įdiegiate pranešimų perdavimą tarpgijų komunikacijos kanalais:

naudoti std:: sinchronizavimas:: mpsc;
naudoti std:: sriegis;

fnpagrindinis() {
// Sukurti kanalą
leisti (siuntėjas, gavėjas) = ​​mpsc:: kanalas ();

// Išneršti giją
gija:: spawn(judėti || {
// Siųsti žinutę per kanalą
sender.send("Sveiki iš gijos!").išvynioti();
});

// Gaukite pranešimą pagrindinėje gijoje
leisti gautas_pranešimas = gavėjas.recv().unwrap();
println!("Gauta žinutė: {}", gautas_pranešimas);
}

The pagrindinis funkcija sukuria kanalą su mpsc:: kanalas () kad grąžina a siuntėjas ir a imtuvas. The siuntėjas siunčia pranešimus į imtuvas kuri gauna pranešimus. The pagrindinis funkcija pradeda kurti gijas ir perkelti nuosavybės teisę į Siuntėjas prie sriegio uždarymo. Sriegio uždarymo viduje, siuntėjas.siųsti() funkcija siunčia pranešimą per kanalą.

The Receiver.recv() funkcija gauna pranešimą sustabdydama vykdymą, kol gija gaus pranešimą. The pagrindinis funkcija išspausdina pranešimą į konsolę po sėkmingo pranešimo gavimo.

Atkreipkite dėmesį, kad siunčiant pranešimą per kanalą sunaudojamas siuntėjas. Jei jums reikia siųsti pranešimus iš kelių gijų, galite klonuoti siuntėją naudodami siuntėjas.klonas() funkcija.

Be to, mpsc modulis pateikia kitus metodus, pvz try_recv(), kuris neblokuodamas bando gauti pranešimą, ir iter(), kuris sukuria gautų pranešimų iteratorių.

Pranešimų perdavimas kanalais suteikia saugų ir patogų būdą bendrauti tarp gijų, išvengiant duomenų lenktynių ir užtikrinant tinkamą sinchronizavimą.

Rust nuosavybės ir skolinimosi modelis garantuoja atminties saugumą

Rust sujungia nuosavybės teisę, skolinimąsi ir skolinimosi tikrintuvą, kad būtų sukurta patikima, saugi ir vienalaikė programavimo sistema.

Skolinimosi tikrintuvas veikia kaip apsauginis tinklas, aptinkant galimas problemas kompiliavimo metu, o ne pasikliaujant vykdymo laiko patikra ar šiukšlių surinkimu.