C++: Многопоточность и параллельное программирование

Цель урока:
Познакомиться с многопоточностью в C++ и научиться создавать параллельные программы.

Что мы узнаем:
  • Что такое многопоточность и как её использовать.
  • Создание и управление потоками.
  • Синхронизация потоков.

Теоретическая часть:

Что такое многопоточность?


Многопоточность позволяет выполнять несколько задач одновременно, что может значительно повысить производительность программы.

Пример создания потока:
#include <thread>

void printHello() {
    std::cout << "Привет из потока!" << std::endl;
}

int main() {
    std::thread t(printHello);
    t.join();
    return 0;
}

Представленный код демонстрирует простой пример использования потоков (std::thread) в C++.

Шаги программы:
  1. Объявление функции:
    Функция printHello() выводит сообщение "Привет из потока!":
    void printHello() {
        std::cout << "Привет из потока!" << std::endl;
    }
  2. Создание потока:
    В основной функции main создается объект типа std::thread, передающий функцию printHello() в качестве аргумента. Это запускает выполнение функции в отдельном потоке исполнения:
    std::thread t(printHello);
  3. Присоединение потока:
    Метод join() ожидает завершения потока, прежде чем продолжить выполнение основного потока:
    t.join();
  4. Завершение программы:
    После завершения потока программа завершается нормально:
    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++. Эти знания помогут вам создавать более сложные и производительные программы.

Автор:  Вчера, 7:18 am