Ответ
Да, один процесс может содержать множество потоков. Все потоки внутри процесса разделяют его адресное пространство (глобальные переменные, куча, открытые файловые дескрипторы), но каждый поток имеет собственный стек и контекст выполнения (регистры, состояние). Это основа многопоточного программирования в 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, что позволяет ускорить выполнение задач, поддающихся распараллеливанию.