Познакомиться с многопоточностью в 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++. Эти знания помогут вам создавать более сложные и производительные программы.