Может ли в одном процессе быть несколько потоков?

«Может ли в одном процессе быть несколько потоков?» — вопрос из категории Многопоточность, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, один процесс может содержать множество потоков. Все потоки внутри процесса разделяют его адресное пространство (глобальные переменные, куча, открытые файловые дескрипторы), но каждый поток имеет собственный стек и контекст выполнения (регистры, состояние). Это основа многопоточного программирования в C++.

Пример создания потоков с использованием std::thread:

#include <iostream>
#include <thread>
#include <vector>

void worker(int id) {
    std::cout << "Поток " << id << " запущен. ID: " 
              << std::this_thread::get_id() << 'n';
}

int main() {
    std::vector<std::thread> threads;

    for (int i = 0; i < 5; ++i) {
        threads.emplace_back(worker, i); // Создание и запуск потока
    }

    for (auto& t : threads) {
        t.join(); // Ожидание завершения всех потоков
    }

    return 0;
}

Ключевые особенности и отличия от процессов:

  • Разделяемые ресурсы: Потоки имеют прямой доступ к памяти процесса, что требует синхронизации (мьютексы, атомарные операции) для избежания состояний гонки (data races).
  • Легковесность: Создание и переключение контекста между потоками значительно дешевле, чем между процессами, так как не требуется смена адресного пространства.
  • Уязвимость: Сбой (например, необработанное исключение) в одном потоке может привести к падению всего процесса, поскольку разделяется общее адресное пространство.
  • Параллелизм: Потоки могут выполняться параллельно на разных ядрах CPU, что позволяет ускорить выполнение задач, поддающихся распараллеливанию.