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

Kak Realizovat Mnogopotocnost V C



Многопоточность в C++ — это функция, позволяющая одновременно выполнять несколько задач в параллельном режиме. Поток — это рабочая единица конкретного выполняемого процесса. Многочисленные потоки выполняются независимо друг от друга одновременно, обеспечивая многопоточность.

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

Многопоточная программа состоит из двух или более частей, которые имеют тенденцию выполняться одновременно. Каждая часть называется потоком и имеет свой путь выполнения. Многочисленные потоки выполняются независимо друг от друга одновременно, обеспечивая многопоточность.







Предварительные требования для многопоточности в C++

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



Откройте компилятор Dev-C++ и перейдите в «Инструменты» на панели задач. Выберите «Параметры компилятора», а затем выберите «Настройки», нажмите на блок «Генерация кода», появится список команд. Выберите GNU C++11 в списке «Языковой стандарт (-std)» и нажмите «ОК». Теперь этот компилятор готов к поддержке потоковых операций.




Загрузите библиотеки с GitHub. и поместите их в папку lib компилятора Cpp. Вызовите эти библиотеки в программе, используя #include «mingw.thread.h» и заголовочные файлы , ниже приведен их синтаксис:





std::thread thread_object ( отзывной ) ;


std::thread поддерживается заголовочным файлом #include «mingw.thread.h» в C++11. Это класс потока, представляющий один поток. Новый поток создается с использованием std::thread, и ему передается вызываемый объект. Callable — это исполняемый код, который выполняется при запуске потока. Callable может быть любого из трех типов, приведенных ниже:

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



Запуск потока с использованием объекта функции

Объект-функцию можно использовать как вызываемую для запуска потока, оператор перегрузки () делает его вызываемым:

класс function_object_class {
оператор пустоты ( ) ( параметры )
{
Заявления;
}
}
std::thread thread_object ( function_object_class ( ) , параметры )


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

Запуск потока с использованием указателя функции

Определяется указатель функции, который затем используется как вызываемый объект для запуска потока:

недействительный function_call ( параметр )
{
Заявления;
}
std::thread thread_obj ( function_call, параметры ) ;


Передаваемые аргументы пишутся после имени функции.

Запуск потока с использованием лямбда-выражения

Объект потока можно запустить, используя лямбду в качестве вызываемого объекта.

// Определить лямбда-выражение
авто ж = [ ] ( параметры )
{
Заявления;
} ;

std::thread thread_object ( е, параметры ) ;


Лямбда-выражение определено, и в нем вызываются параметры для запуска потока.

В некоторых случаях поток должен остановиться, прежде чем он начнет выполнять следующую команду. std::thread::join () Функция используется для ожидания завершения потока. Например, если мы назначаем потоку задачу графического интерфейса, нам нужно дождаться времени его завершения, чтобы сначала правильно загрузить графический интерфейс, а затем произойдет выполнение следующей команды.

int главный ( )
{

станд::поток t1 ( отзывной ) ;
t1.join ( ) ;
Заявления;
}

Пример

Это программа, которая выполняется для выполнения многопоточности с использованием всех трех вызываемых. Три разных вызываемых объекта выполняют соответствующие команды одновременно три раза, не прерываясь друг от друга:

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


пустота фу ( интервал Z )
{
для ( интервал я = 0 ; я < З; я++ ) {
расчет << «Поток с использованием функции»
' указатель как вызываемый \п ' ;
}
}


класс thread_obj {
публика:
оператор пустоты ( ) ( интервал х )
{
для ( интервал я = 0 ; я < Икс; я++ )
расчет << «Поток с использованием функции»
' объект как вызываемый \п ' ;
}
} ;


// основной код
int главный ( )
{
расчет << «Потоки 1, 2 и 3»
«действующий независимо»
<< конец;


нить th1 ( фу, 3 ) ;


нить th2 ( thread_obj ( ) , 3 ) ;


авто ж = [ ] ( интервал х ) {
для ( интервал я = 0 ; я < Икс; я++ )
расчет << «Поток с использованием лямбды»
'выражение как вызываемое \п ' ;
} ;


нить th3 ( е, 3 ) ;

th1.join ( ) ;

th2.join ( ) ;

th3.join ( ) ;

возвращаться 0 ;
}


В этой программе три вызываемых объекта, включая указатель функции, объект функции и лямбда-выражение, используются для одновременного запуска трех потоков. Потоки 1, 2 и 3 печатают свои значения одновременно, независимо друг от друга, не прерываясь друг другом. Они печатают свои значения трижды. Функция join() используется для ожидания завершения потока.


Результаты всех трех потоков отображаются независимо и повторяются три раза. Каждый поток ждет, пока другой завершится первым.

Заключение

Многопоточность в C++ — это функция, позволяющая одновременно выполнять несколько задач в параллельном режиме. Многопоточная программа имеет две или более секции, которые могут выполняться одновременно, каждая часть называется потоком и имеет отдельный путь для выполнения. Существует три вызываемых объекта для запуска потоков, указателей функций, объектов функций и лямбда-выражений. Они обеспечивают многопоточность.