multithreading c with examples
Una breu introducció al multithreading en C ++.
En aquest tutorial, obtindrem una visió general del multithreading en C ++.
Llavors, què és un fil? Un fil és una unitat de treball d’un procés concret. En sistemes operatius de programació múltiple, s’executen diferents processos simultàniament.
De manera similar, és possible que vulguem executar les mateixes instàncies de procés simultàniament. Cada instància de procés, en aquest cas, s’assigna a una unitat d’execució anomenada fil. En un sistema multithreading, nombrosos fils s’executen simultàniament independentment els uns dels altres.
=> Mireu aquí la guia per a principiants de C ++.
obriu els fitxers .jar de Windows 10
Abans de C ++ 11, teníem suport de fils POSIX. Però aquesta característica tenia problemes de portabilitat greus, ja que només funcionava al sistema operatiu Linux o UNIX. Així, a partir de C ++ 11, tenim una sola classe std :: thread que defineix totes les funcionalitats dels fils. Les classes i les funcions es defineixen al fitxer de capçalera.
Què aprendreu:
Funcionament de
Utilitzant std :: thread, simplement necessitem crear un nou objecte de fil i passar-li un text anomenable. Un anomenable és un codi executable que volem executar quan s'executa el fil. Per tant, sempre que vulguem un nou fil, només hem de crear un objecte de std :: thread i passar-lo com a argument al seu constructor.
Un cop creat l'objecte std :: thread, s'inicia un nou fil i s'executa el codi proporcionat per callable.
Vegem com podem definir un objecte de conversió que es pot proporcionar a l'objecte de fil.
Un anomenable es pot definir de tres maneres.
# 1) Ús de l'objecte Function
Podem utilitzar un objecte de funció com a cridable a l’objecte fil. Per utilitzar l’objecte de funció, hem de tenir una classe i, en aquesta classe, sobrecarreguem l’operador (). Aquesta funció sobrecarregada conté el codi que cal executar quan es crea el fil.
/ / Define the class for function object class functioObject_class { // Overload () operator void operator()(params) { // code to be executed } }; // Create thread object
std::thread thread_object(functioObject_class (), params)
Tingueu en compte la forma en què es defineix l'objecte fil. Com a primer paràmetre del constructor de l'objecte de fil, proporcionem la funció sobrecarregada i, a continuació, especifiquem els seus arguments (params) com a segon argument.
# 2) Ús de punter de funcions
Un indicador de funció que es pot trucar es pot definir de la següent manera.
void funct_call(params) //code to be executed }
Un cop definida aquesta funció, podem crear un objecte fil amb aquesta funció com a cridable, de la següent manera.
std::thread thread_obj(funct_call, params);
Tingueu en compte que els arguments (params) passats a la funció es proporcionen després del nom de la funció a l'objecte de fil.
# 3) Ús d’una expressió Lambda
També podem tenir una expressió cridable com a lambda i passar-la a l'objecte de fil per a l'execució. A continuació es mostra el fragment de codi del mateix.
// Define a lambda expression auto f = ()(params) { // code for execution };
std::thread thread_object(f, params);
Al codi anterior, hem definit una expressió lambda f i després la passem al constructor d’objectes de fil com a primer argument seguit dels seus paràmetres (params) com a segon argument.
std::thread join method
En alguns casos, és possible que vulguem que acabi el fil en execució actual abans d’iniciar una altra acció.
Un exemple clàssic és quan obrim l’aplicació GUI. En el moment que obrim l’aplicació, s’inicia un fil per carregar i inicialitzar la interfície gràfica d’usuari i no podem realitzar cap acció tret que la càrrega i inicialització es faci correctament per garantir que la interfície gràfica funcioni correctament.
quin és el vostre enfocament mentre proveu aplicacions mòbils
La classe std :: thread proporciona un mètode join () que garanteix que el fil actual (assenyalat per * this) acabi primer abans de realitzar qualsevol altra acció.
Preneu l’exemple següent,
int main() { std::thread t1(callable_code); ….. t1.join(); ….. }
A l'exemple anterior, la funció principal haurà d'esperar per continuar fins que s'acabi el fil t1. En general, la funció d'unió del fil bloqueja altres accions / funcionalitats fins que la trucada del fil finalitza la seva execució.
Exemple de fil
Presentem un exemple complet de codificació per a la creació i execució del fil al programa que es mostra a continuació.
#include #include using namespace std; // function to be used in callable void func_dummy(int N) { for (int i = 0; i Sortida:
Fil 1 :: indicable => punter de funció
Fil 1 :: indicable => punter de funció
Fil 3 :: cridable => expressió lambda
Fil 3 :: cridable => expressió lambda
Fil 2 :: anomenable => objecte de funció
Fil 2 :: anomenable => objecte de funció
A l'exemple anterior, hem creat tres fils utilitzant tres indicacions diferents, és a dir, punter de funció, objecte i expressió lambda. Creem 2 instàncies de cada fil i les iniciem. Com es mostra a la sortida, tres fils funcionen simultàniament independentment els uns dels altres.
Lectura recomanada = >> Guia de proves de fils
Conclusió
En aquest tutorial, hem vist els conceptes multithreading a C ++ amb un exemple clar. En els nostres tutorials posteriors, aprendrem més temes de C ++ que ens ajudarien a escriure programes robustos i eficients.
=> Llegiu la sèrie de formació Easy C ++.
Lectura recomanada
- Tutorial de funcions principals de Python amb exemples pràctics
- Tutorial de Python DateTime amb exemples
- Talla l'ordre a Unix amb exemples
- Sintaxi d'ordres Unix Cat, opcions amb exemples
- Ús del cursor a MongoDB amb exemples
- Ordre Ls a Unix amb exemples
- MongoDB Sort () Mètode amb exemples
- Ordre Grep a Unix amb exemples senzills