Kuinka toteuttaa monisäikeisyys C++:ssa

Kuinka Toteuttaa Monisaikeisyys C Ssa



C++:n monisäikeisyys on ominaisuus, jonka avulla voidaan suorittaa useita tehtäviä samanaikaisesti samanaikaisesti. Säie on tietyn suoritettavan prosessin työyksikkö. Lukuisat säikeet suoritetaan toisistaan ​​riippumatta samanaikaisesti monisäikeistyksen suorittamiseksi.

Kuinka toteuttaa monisäikeisyys C++:ssa

Monisäikeisessä ohjelmassa on kaksi tai useampia osia, joilla on taipumus ajaa samanaikaisesti, jokainen osa tunnetaan säikeenä ja sillä on erilainen suorituspolku. Lukuisat säikeet suoritetaan toisistaan ​​riippumatta samanaikaisesti monisäikeistyksen suorittamiseksi.







Edellytykset monisäikeiseen C++-kieleen

Windowsissa säikeisiin liittyviä toimintoja voidaan suorittaa C++ 11:ssä ja edistyneissä versioissa. Kun käytät Dev-C++-kääntäjää, se on oletuksena C++ 3 -versiossa, joten se on vaihdettava C++ 11 -versioon manuaalisesti. GNU C++11 -ympäristö voidaan valita muuttamalla kielistandardiasetuksia.



Avaa Dev-C++-kääntäjä ja siirry tehtäväpalkin kohtaan 'Työkalut'. Valitse 'Compiler Options' ja valitse sitten 'Settings', napsauta 'Code Generation' -lohkoa, jolloin näkyviin tulee luettelo komennoista. Valitse GNU C++11 kohdasta 'Language Standard(-std)' ja napsauta sitten OK. Nyt tämä kääntäjä on asetettu tukemaan säiettätoimintoja.




Lataa kirjastot GitHubista ja sijoita ne Cpp-kääntäjän lib-kansioon. Kutsu näitä kirjastoja ohjelmassa käyttämällä #include 'mingw.thread.h' ja otsikkotiedostoja. Alla on sen syntaksi:





std::thread thread_object ( kutsuttavissa ) ;


Std::säiettä tukee C++11:n #include 'mingw.thread.h' otsikkotiedosto. Se on lankaluokka ja edustaa yhtä säiettä. Uusi säie luodaan käyttämällä std::threadia ja siihen välitetään kutsuttava. Kutsuttava on suoritettava koodi, joka suoritetaan, kun säiettä suoritetaan. Soitettava voi olla mikä tahansa alla mainituista kolmesta tyypistä:

Kun objekti luodaan, se käynnistää uuden säikeen, joka suorittaa kutsuttavan koodin.



Threadin käynnistäminen Function Objectin avulla

Funktioobjektia voidaan käyttää kutsuttavana säikeen käynnistämiseen, ylikuormitusoperaattori () tekee siitä kutsuttavan:

luokka funktio_objekti_luokka {
tyhjä operaattori ( ) ( parametrit )
{
lausunnot;
}
}
std::thread thread_object ( function_object_class ( ) , parametrit )


Ylikuormitusfunktio annetaan rakentajalle ensimmäisenä objektina ja käskyt toisena objektina.

Threadin käynnistäminen Function Pointerin avulla

Toimintoosoitin määritellään, ja sitä käytetään sitten kutsuttavana säikeen käynnistämiseen:

void function_call ( param )
{
lausunnot;
}
std::thread thread_obj ( function_call, params ) ;


Välitettävät argumentit kirjoitetaan funktion nimen jälkeen.

Threadin käynnistäminen Lambda Expressionilla

Lankaobjekti voidaan käynnistää käyttämällä lambdaa kutsuttavana.

// Määrittele lambda-lauseke
auto f = [ ] ( parametrit )
{
lausunnot;
} ;

std::thread thread_object ( f, parametrit ) ;


Lambda-lauseke määritellään ja parametrit kutsutaan siinä käynnistämään säikeen.

Joissakin tapauksissa säiettä on lopetettava ennen kuin se alkaa suorittaa seuraavaa komentoa. The std::ketju::liitty () -toimintoa käytetään odottamaan langan loppumista. Jos esimerkiksi määritämme säikeelle graafisen käyttöliittymän tehtävän, meidän on odotettava sen päättymisaikaa, jotta graafinen käyttöliittymä ladataan ensin oikein ja sitten suoritetaan seuraava komento.

int main ( )
{

std::säie t1 ( kutsuttavissa ) ;
t1.liittyä ( ) ;
lausunnot;
}

Esimerkki

Tämä on ohjelma, joka suoritetaan monisäikeen suorittamiseen käyttämällä kaikkia kolmea kutsuttavaa. Kolme eri kutsuttavaa suorittaa vastaavat komentonsa samanaikaisesti kolme kertaa ilman toistensa keskeyttämistä:

#include
#sisällytä
käyttäen nimiavaruutta std;


tyhjä foo ( int Z )
{
varten ( int i = 0 ; i < Z; i++ ) {
cout << 'Käie käyttämällä toimintoa'
'-osoitin soitettaviksi \n ' ;
}
}


luokka thread_obj {
julkinen:
tyhjä operaattori ( ) ( int x )
{
varten ( int i = 0 ; i < x; i++ )
cout << 'Käie käyttämällä toimintoa'
'-objekti kutsuttavana \n ' ;
}
} ;


// pääkoodi
int main ( )
{
cout << 'Säikeet 1 ja 2 ja 3'
'toimii itsenäisesti'
<< endl;


lanka th1 ( foo, 3 ) ;


lanka th2 ( thread_obj ( ) , 3 ) ;


auto f = [ ] ( int x ) {
varten ( int i = 0 ; i < x; i++ )
cout << 'Lambda-lanka'
' ilmaisu kutsuttavana \n ' ;
} ;


lanka th3 ( f, 3 ) ;

th1.join ( ) ;

th2.join ( ) ;

th3.join ( ) ;

palata 0 ;
}


Tässä ohjelmassa kolmea kutsuttavaa, mukaan lukien funktioosoitin, funktioobjekti ja lambda-lauseke, käytetään käynnistämään kolme säiettä samanaikaisesti. Säikeet 1, 2 ja 3 tulostavat arvonsa samanaikaisesti, toisistaan ​​riippumatta, toistensa keskeyttämättä. He painavat arvonsa kolmesti. Join()-funktiota käytetään odottamaan säikeen päättymistä.


Kaikkien kolmen säikeen lähdöt näytetään erikseen ja toistetaan kolme kertaa. Jokainen lanka odottaa toisen päättymistä ensin.

Johtopäätös

C++:n monisäikeisyys on ominaisuus, jonka avulla voidaan suorittaa useita tehtäviä samanaikaisesti samanaikaisesti. Monisäikeisessä ohjelmassa on kaksi tai useampia osioita, jotka voivat toimia samanaikaisesti, jokainen osa tunnetaan säikeenä ja sillä on erillinen polku suoritusta varten. Säikeiden, toimintoosoittimien, funktioobjektien ja lambda-lausekkeiden käynnistämiseen on kolme kutsuttavaa. Nämä mahdollistavat monisäikeisyyden.