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