Познакомиться с многопоточностью в C++ и научиться создавать параллельные программы.
Что мы узнаем:
- Что такое многопоточность и как её использовать.
- Создание и управление потоками.
- Синхронизация потоков.
Теоретическая часть:
Что такое многопоточность?
Многопоточность позволяет выполнять несколько задач одновременно, что может значительно повысить производительность программы.
Пример создания потока:
#include <thread>
void printHello() {
std::cout << "Привет из потока!" << std::endl;
}
int main() {
std::thread t(printHello);
t.join();
return 0;
}
Представленный код демонстрирует простой пример использования потоков (
std::thread
) в C++.Шаги программы:
- Объявление функции:
ФункцияprintHello()
выводит сообщение"Привет из потока!"
:void printHello() { std::cout << "Привет из потока!" << std::endl; }
- Создание потока:
В основной функцииmain
создается объект типаstd::thread
, передающий функциюprintHello()
в качестве аргумента. Это запускает выполнение функции в отдельном потоке исполнения:std::thread t(printHello);
- Присоединение потока:
Методjoin()
ожидает завершения потока, прежде чем продолжить выполнение основного потока:t.join();
- Завершение программы:
После завершения потока программа завершается нормально:return 0;
Что происходит?
- Когда поток запускается командой
std::thread t(printHello);
, создаётся новый поток, выполняющий функциюprintHello
. - Основной поток ждёт завершения дочернего потока с помощью метода
join()
, после чего завершает программу.
Таким образом, вывод программы выглядит следующим образом:
Привет из потока!
Управление потоками
Потоки можно создавать, запускать и останавливать.
Пример использования
std::thread
:
#include <thread>
void printHello() {
std::cout << "Привет из потока!" << std::endl;
}
int main() {
std::thread t(printHello);
t.join();
return 0;
}
Синхронизация потоков
Синхронизация потоков позволяет избежать конфликтов при доступе к общим ресурсам.
Пример использования
std::mutex
:
#include <thread>
#include <mutex>
std::mutex mtx;
void printHello() {
mtx.lock();
std::cout << "Привет из потока!" << std::endl;
mtx.unlock();
}
int main() {
std::thread t1(printHello);
std::thread t2(printHello);
t1.join();
t2.join();
return 0;
}
Практическая часть:
Задача 1: Создайте программу с двумя потоками, которые выводят сообщения.
#include <thread>
void printHello() {
std::cout << "Привет из потока!" << std::endl;
}
int main() {
std::thread t1(printHello);
std::thread t2(printHello);
t1.join();
t2.join();
return 0;
}
Задача 2: Создайте программу с синхронизацией потоков.
#include <thread>
#include <mutex>
std::mutex mtx;
void printHello() {
mtx.lock();
std::cout << "Привет из потока!" << std::endl;
mtx.unlock();
}
int main() {
std::thread t1(printHello);
std::thread t2(printHello);
t1.join();
t2.join();
return 0;
}
Итог урока:
Сегодня мы узнали, как использовать многопоточность в C++. Эти знания помогут вам создавать более сложные и производительные программы.