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

Kak Da Vnedrim Mnogopotocnost V C



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

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

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







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

В Windows функциите, свързани с нишките, могат да се изпълняват в C++ 11 и разширените версии. Докато използвате компилатора Dev-C++, по подразбиране той е на версия C++ 3, така че трябва да бъде променен на версия C++ 11 ръчно. Средата GNU C++11 може да бъде избрана чрез промяна на езиковите стандартни настройки.



Отворете компилатора Dev-C++ и отидете на „Инструменти“ в лентата на задачите. Изберете „Опции на компилатора“ и след това изберете „Настройки“, щракнете върху блока „Генериране на код“ и ще се появи списък с командите. Изберете GNU C++11 от „Езиков стандарт(-std)“ и след това щракнете върху OK. Сега този компилатор е готов да поддържа операции с нишки.




Изтеглете библиотеките от GitHub и ги поставете в папката lib на Cpp компилатора. Извикайте тези библиотеки в програмата, като използвате #include “mingw.thread.h” и заглавни файлове, по-долу е неговият синтаксис:





std::thread нишка_обект ( изискуем ) ;


std::thread се поддържа от заглавния файл #include “mingw.thread.h” в C++11. Това е клас нишка и представлява единична нишка. Създава се нова нишка с помощта на std::thread и към нея се предава извикваем. Callable е изпълним код, който се изпълнява, когато нишката се изпълнява. Callable може да бъде всеки от трите типа, дадени по-долу:

Когато се създаде обект, той стартира нова нишка, която изпълнява кода в извиквания.



Стартиране на нишка чрез функционален обект

Функционален обект може да се използва като извикваем за стартиране на нишката, операторът за претоварване () го прави извикваем:

клас функция_клас_обект {
празен оператор ( ) ( параметри )
{
Изявления;
}
}
std::thread нишка_обект ( функционален_обектен_клас ( ) , параметри )


Функцията за претоварване се предоставя на конструктора като първи обект и изрази като втори обект.

Стартиране на нишка чрез функционален указател

Дефинира се указател на функция и след това се използва като извикваем за стартиране на нишка:

невалидно извикване на функция ( парам )
{
Изявления;
}
std::thread thread_obj ( извикване на функция, параметри ) ;


Аргументите, които трябва да се подадат, се записват след името на функцията.

Стартиране на нишка с помощта на ламбда израз

Обектът на нишката може да бъде стартиран с помощта на ламбда като извикваем.

// Дефинирайте ламбда израз
автоматично f = [ ] ( параметри )
{
Изявления;
} ;

std::thread нишка_обект ( f, параметри ) ;


Ламбда изразът е дефиниран и параметрите се извикват в него за стартиране на нишката.

В някои случаи нишката трябва да спре, преди да започне да изпълнява следващата команда. The std::thread::join () функцията се използва за изчакване края на нишката. Например, в случай че присвоим задача на  GUI на нишката, трябва да изчакаме нейното крайно време, за да заредим правилно GUI първо и след това ще се осъществи изпълнението на следващата команда.

int main ( )
{

std::thread t1 ( изискуем ) ;
t1.присъединяване ( ) ;
Изявления;
}

Пример

Това е програма, която се изпълнява за извършване на многопоточност, като се използват и трите извикваеми. Три различни извикваеми изпълняват съответните си команди едновременно три пъти, без да бъдат прекъсвани един от друг:

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


празен foo ( int Z )
{
за ( int i = 0 ; i < Z; i++ ) {
cout << „Функция за използване на нишка“
' указател като извикваем ' ;
}
}


клас thread_obj {
публичен:
празен оператор ( ) ( int x )
{
за ( int i = 0 ; i < х; i++ )
cout << „Функция за използване на нишка“
' обект като извикваем ' ;
}
} ;


// основен код
int main ( )
{
cout << 'Нишки 1 и 2 и 3'
'работещ независимо'
<< endl;


нишка th1 ( Фу, 3 ) ;


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


автоматично f = [ ] ( int x ) {
за ( int i = 0 ; i < х; i++ )
cout << „Нишка, използваща ламбда“
' израз като извикваем ' ;
} ;


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

th1.join ( ) ;

th2.join ( ) ;

th3.join ( ) ;

връщане 0 ;
}


В тази програма трите извикваеми, включително функционален указател, функционален обект и ламбда израз, се използват за стартиране на трите нишки едновременно. Нишки 1, 2 и 3 отпечатват стойностите си едновременно, независимо една от друга, без да бъдат прекъсвани една от друга. Те отпечатват своите стойности три пъти. Функцията join() се използва за изчакване края на нишката.


Резултатите от трите нишки се показват независимо и се повтарят три пъти. Всяка нишка чака другата да приключи първа.

Заключение

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