---
title: Процессы и потоки
seo:
  title: Процессы и потоки — C++ Developer
  description: Тема «Процессы и потоки» для собеседования C++ Developer. Что вам известно о многопоточности? Что общего и отличного в процессах и потоках?
---

[Все темы C++ Developer](/c-developer)

## <strong>Что вам известно о многопоточности?</strong> [#q-14bee738d69b817e9f94d152f5a2e082]

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

#### Основные понятия&#58;

{/* prettier-ignore */}
1. <strong>Поток (Thread)</strong>&#58; Лёгкий процесс внутри программы, который может выполняться параллельно с другими потоками.

1. <strong>Создание потоков</strong>&#58;

    - В C++ можно использовать библиотеку <code>&#60;thread&#62;</code>.

    ```cpp
    #include <thread>
    void func() { /* ... */ }
    int main() {
        std::thread t(func);
        t.join();  // Ожидание завершения потока
    }
    ```

1. <strong>Синхронизация</strong>&#58;

    - Необходима для корректного доступа к общим данным.

    - Используются механизмы синхронизации, такие как мьютексы (<code>std&#58;&#58;mutex</code>), условные переменные (<code>std&#58;&#58;condition&#95;variable</code>), атомарные операции (<code>std&#58;&#58;atomic</code>).

    ```cpp
    #include <mutex>
    std::mutex mtx;
    void threadFunc() {
        std::lock_guard<std::mutex> lock(mtx);
        // Защищённый доступ к данным
    }
    ```

1. <strong>Гонки данных</strong>&#58;

    - Возникают при конфликтующих обращениях к одной области памяти без нужного happens-before, когда хотя бы одно обращение неатомарно и хотя бы одно изменяет данные. Гонка данных в C++ приводит к неопределённому поведению. Одновременные чтения сами по себе не являются гонкой.

1. <strong>Параллелизм и конкурентность</strong>&#58;

    - Параллелизм&#58; Одновременное выполнение потоков на разных ядрах процессора.

    - Конкурентность&#58; Продвижение нескольких задач в перекрывающиеся промежутки времени. Задачи могут чередоваться на одном ядре или выполняться параллельно на нескольких.

#### Применение&#58;

- Улучшение производительности за счёт параллельного выполнения задач.

- Реализация асинхронных операций и обработка ввода-вывода.

- Обработка данных в реальном времени.

:::note[Ссылки для изучения]

1. [Многопоточность в C++](https://habr.com/ru/companies/otus/articles/549814/)
   :::

---

## <strong>Что общего и отличного в процессах и потоках?</strong> [#q-14bee738d69b8175873dd1c4bfff956d]

Между процессами и потоками есть сходства и отличия&#58;

#### Общее&#58;

1. <strong>Выполнение</strong>&#58; Оба являются единицами выполнения кода.

1. <strong>Параллелизм</strong>&#58; Оба могут выполняться параллельно для
   повышения производительности.

#### Отличия&#58;

{/* prettier-ignore */}
1. <strong>Изоляция</strong>&#58;

    - <strong>Процессы</strong>&#58; Изолированы друг от друга, имеют собственную память.

    - <strong>Потоки</strong>&#58; Разделяют память и ресурсы одного процесса.

1. <strong>Создание</strong>&#58;

    - <strong>Процессы</strong>&#58; Создание нового процесса требует значительных системных ресурсов.

    - <strong>Потоки</strong>&#58; Создание потоков менее затратное и быстрее.

1. <strong>Контекст переключения</strong>&#58;

    - <strong>Процессы</strong>&#58; Переключение контекста между процессами более дорогое.

    - <strong>Потоки</strong>&#58; Переключение контекста между потоками быстрее и менее затратное.

1. <strong>Взаимодействие</strong>&#58;

    - <strong>Процессы</strong>&#58; Используют межпроцессное взаимодействие (IPC) для обмена данными (сокеты, очереди сообщений, shared memory).

    - <strong>Потоки</strong>&#58; Могут общаться напрямую через общую память, что требует синхронизации.

#### Пример&#58;

- <strong>Процесс</strong>&#58; Программа, запущенная на компьютере (например,
  веб-браузер).

- <strong>Поток</strong>&#58; Легковесные задачи внутри процесса (например,
  рендеринг страницы, обработка ввода пользователя).

:::note[Ссылки для изучения]

1. [Многопоточность в C++](https://habr.com/ru/companies/otus/articles/549814/)
   :::
