multithreading c with examples
Кратко въведение в многопоточността в C ++.
В този урок ще получим преглед на многопоточността в C ++.
И така, какво е нишка? Нишката е работна единица на определен процес. В многопрограмиращите операционни системи различните процеси се изпълняват едновременно.
По подобен начин може да искаме да изпълняваме едни и същи екземпляри на процеса едновременно. В този случай всеки екземпляр на процеса се присвоява на единица за изпълнение, наречена нишка. В многонишковата система многобройни нишки се изпълняват едновременно независимо един от друг.
най-добрият безплатен почистващ регистър за Windows 10
=> Погледнете тук ръководството за начинаещи C ++.
Преди C ++ 11 имахме поддръжка на нишки POSIX. Но тази функция имаше сериозни проблеми с преносимостта, тъй като работеше само на операционната система Linux или UNIX. Така от C ++ 11 нататък имаме един клас std :: нишка който дефинира цялата функционалност за нишки. Класовете и функциите са дефинирани в заглавния файл.
Какво ще научите:
Работа на
Използвайки std :: thread, просто трябва да създадем нов обект на нишка и да му предадем извикващ се. Извикващият е изпълним код, който искаме да изпълним, когато нишката работи. Така че, когато искаме нова нишка, ние просто създаваме обект от std :: thread и предаваме извикващ като аргумент на неговия конструктор.
След като обектът std :: thread бъде създаден, стартира се нова нишка и се изпълнява кодът, предоставен от callable.
Нека видим как можем да дефинираме извикващо, което да бъде предоставено на обекта на нишката.
Извикващият може да бъде дефиниран по три начина.
# 1) Използване на функционалния обект
Можем да използваме функционален обект като извикваем в обекта на нишката. За да използваме функционалния обект, трябва да имаме клас и в този клас претоварваме оператора (). Тази претоварена функция съдържа кода, който трябва да бъде изпълнен при създаването на нишката.
/ / 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)
Обърнете внимание на начина, по който е дефиниран обектът на нишката. Като първи параметър за конструктора на обект на нишка, ние предоставяме претоварената функция и след това посочваме нейните аргументи (параметри) като втори аргумент.
# 2) Използване на функционален указател
Извикващ се с помощта на указател на функция може да бъде дефиниран по следния начин.
void funct_call(params) //code to be executed }
След като дефинираме тази функция, можем да създадем обект на нишка с тази функция като извикваем по следния начин.
std::thread thread_obj(funct_call, params);
Обърнете внимание, че аргументите (параметрите), предадени на функцията, се предоставят след името на функцията в обекта на нишката.
# 3) Използване на ламбда израз
Можем също да имаме извикваем като ламбда израз и да го предадем на обекта на нишката за изпълнение. Кодовият фрагмент за същото е показан по-долу.
// Define a lambda expression auto f = ()(params) { // code for execution };
std::thread thread_object(f, params);
В горния код дефинирахме ламбда израз f и след това го предаваме на конструктора на нишки като първи аргумент, последван от неговите параметри (параметри) като втори аргумент.
std::thread join method
В някои случаи може да искаме изпълняваната в момента нишка да завърши, преди да започнем друго действие.
Класически пример е, когато отваряме GUI приложението. В момента, в който отворим приложението, стартира нишка за зареждане и инициализиране на GUI и не можем да извършим никакво действие, освен ако зареждането и инициализирането не се извършат правилно, за да се гарантира, че GUI работи правилно.
Класът std :: thread осигурява метод join (), който гарантира, че текущата нишка (посочена от * this) завършва първо преди да се предприемат други действия.
Вземете следния пример,
int main() { std::thread t1(callable_code); ….. t1.join(); ….. }
В горния пример основната функция ще трябва да изчака да продължи, докато нишката t1 завърши. По принцип функцията за присъединяване на нишка блокира други действия / функционалност, докато извикването на нишка завърши изпълнението си.
Пример за нишка
Представяме пълен пример за кодиране за създаване и изпълнение на нишката в програмата, показана по-долу.
#include #include using namespace std; // function to be used in callable void func_dummy(int N) { for (int i = 0; i Изход:
Тема 1 :: callable => указател на функция
Тема 1 :: callable => указател на функция
Тема 3 :: callable => ламбда израз
Тема 3 :: callable => ламбда израз
Тема 2 :: callable => функция обект
Тема 2 :: callable => функция обект
В горния пример създадохме три нишки, използвайки три различни извикващи се, т.е. указател на функция, обект и ламбда израз. Създаваме 2 екземпляра на всяка нишка и ги стартираме. Както е показано в изхода, три нишки работят едновременно независимо един от друг.
Препоръчително четене = >> Ръководство за тестване на нишки
Заключение
В този урок видяхме многопоточните концепции в C ++ с ясен пример. В следващите ни уроци ще научим повече теми на C ++, които биха ни помогнали да напишем стабилни и ефективни програми.
=> Прочетете серията Easy C ++ Training.
Препоръчително четене
- Урок за основната функция на Python с практически примери
- Урок за Python DateTime с примери
- Изрежете командата в Unix с примери
- Синтаксис на командата Unix Cat, Опции с примери
- Използване на курсора в MongoDB с примери
- Ls Command в Unix с примери
- Метод за сортиране на MongoDB () с примери
- Команда Grep в Unix с прости примери