Как да използваме многопоточност в C++

Kak Da Izpolzvame Mnogopotocnost V C



Многопоточност е концепцията за изпълнение на множество нишки за изпълнение в рамките на една програма. Това е много полезна функция в езиците за програмиране като C++, тъй като ни позволява да извършваме множество операции едновременно. В C++, многопоточност може да се постигне чрез <нишка> библиотека, която предоставя набор от класове и функции, които позволяват на разработчиците да създават, управляват и контролират множество нишки.

Многопоточност е точно като многозадачност. Това означава, че две или повече нишки се изпълняват едновременно. В такава програма всеки компонент се нарича нишка и всяка нишка определя уникален път на изпълнение. Няма вградена поддръжка за многонишков програми преди C++ 11. Вместо това тази функция се предоставя изцяло от операционната система.







Многопоточност може също да се нарече разделяне на програма на по-малки нишки, които се изпълняват едновременно. Класът на нишката, който се използва за многопоточност в C++ ви позволява да конструирате множество нишки и да управлявате тяхното изпълнение.



Създаване на нишки в C++

За да създадем нишка в C++, използваме std::нишка клас, който е включен във вградената библиотека с нишки. А изискуем се предоставя като аргумент на конструктора на обект от класа std::нишка за да генерирате нова нишка. Кодът, който се изпълнява, когато дадена нишка е активна, е известен като изискуем . Когато конструираме a std::нишка обект, се създава нова нишка, която предизвиква кода, доставен от изискуем да се управлява. Извикваем може да се определи с помощта на тези три метода.



Метод 1: Функционален указател

Извикваем функции, използващи указател на функция, могат да бъдат дефинирани по този начин.





невалидно извикване на функция ( параметри )

Когато функцията е конструирана, обект на нишка, съдържащ функцията, се генерира, както следва:



std::thread thread_obj ( извикване на функция, параметри ) ;

Метод 2: Функционален обект

Докато използваме функционалния обект, ние се възползваме от идеята за претоварване на оператора. Кодът, който трябва да се изпълнява, докато нишката се формира, се съдържа в претоварената функция.

клас Обектен_клас {
празен оператор ( ) ( параметри )
{
// код за изпълнение
}
} ;
std::thread thread_object ( Обектен_клас ( ) , параметри )

Метод 3: Ламбда израз

Извикваем функции, използващи ламбда израз, могат да бъдат дефинирани по този начин.

автоматично f = [ ] ( параметри ) {
// код за изпълнение
} ;
std::thread thread_object ( f, параметри ) ;

Пример за многопоточност в C++

#include
#include <нишка>
използване на пространство от имена std;

void func_thread ( int N )
{
за ( int i = 0 ; i < Н; i++ ) {
cout << 'Нишка 1 :: callable => Използване на указател на функция ' ;
}
}

клас thread_obj {
публичен:
празен оператор ( ) ( int n ) {
за ( int i = 0 ; i < н; i++ )
cout << 'Нишка 2 :: callable => Използване на функционален обект ' ;
}
} ;

int main ( )
{

автоматично f = [ ] ( int n ) {
за ( int i = 0 ; i < н; i++ )
cout << „Нишка 3 :: callable => Използване на ламбда израз ' ;
} ;

нишка th1 ( func_thread, 2 ) ;

нишка th2 ( thread_obj ( ) , 2 ) ;

нишка th3 ( е, 2 ) ;

th1.join ( ) ;

th2.join ( ) ;

th3.join ( ) ;

връщане 0 ;
}

В горния код сме разработили три нишки с три отделни изискуеми — указател на функция, обект и ламбда израз. Всяка нишка се стартира като две отделни инстанции. Три нишки са активни едновременно и отделно, както е посочено в изхода.

Изход

Предимства и недостатъци на многопоточността

Повече работа може да се свърши по-бързо благодарение на многопоточност . Това е така, защото позволява на множество нишки да изпълняват различни задачи наведнъж. Многопоточност позволява на програмистите да извършват мрежови дейности, да обработват снимки или видеоклипове и да извършват сложни изчисления, без да забавят останалата част от приложението. Многопоточност помага да се направят потребителските интерфейси по-отзивчиви. Чрез изпълнение на кода, който променя екрана в отделна нишка, нишката на потребителския интерфейс се поддържа свободна за извършване на други задачи, като например отговаряне на потребителско въвеждане. Това води до по-плавни и по-бързи потребителски интерфейси.

Има обаче някои ограничения за използването многопоточност . Едно от основните предизвикателства при работа с многонишков програмите избягват състезателни условия. Състезание е ситуация, при която две или повече нишки се опитват да получат достъп до един и същ споделен ресурс едновременно, което води до непредсказуемо поведение. За да избегнат условия на състезание, разработчиците използват техники за синхронизация като мютекси, семафори и бариери.

Заключение

Многопоточност в C++ е мощна концепция, която позволява на разработчиците да създават програми, които могат да изпълняват множество задачи едновременно. Чрез използването на класа на нишките, предоставен от библиотеката, разработчиците могат да създават, управляват и контролират множество нишки. Многопоточност може да се използва за подобряване на производителността, увеличаване на отзивчивостта и преодоляване на ограниченията на системните ресурси. Въпреки това, поради предизвикателствата, свързани с работата с многонишков програми, разработчиците трябва да бъдат внимателни и да използват подходящи техники за синхронизиране, за да избегнат условия на състезание.