#include <iostream>
#include <thread>
#include <chrono>
#include <vector>
#include <cstdlib> // для rand()
#include <ctime> // для time()
// Функция для обычных потоков
void worker(int id) {
// 1. Печатает "Поток X начал работу"
std::cout << "Поток " << id << " начал работу\n";
// 2. Ждёт случайное количество секунд (1-5)
int seconds = rand() % 5 + 1; // случайное число от 1 до 5
std::this_thread::sleep_for(std::chrono::seconds(seconds));
// 3. Печатает "Поток X завершил работу через Y секунд"
std::cout << "Поток " << id << " завершил работу через " << seconds << " секунд\n";
}
int main() {
// Инициализируем генератор случайных чисел
srand(time(nullptr));
// Вектор для хранения всех потоков
std::vector<std::thread> threads;
// TODO: создайте 5 потоков в цикле, добавив их в vector
for (int i = 1; i <= 5; ++i) {
threads.push_back(std::thread(worker, i));
}
// TODO: добавьте специальный поток с lambda
std::string message = "Привет из главного потока!";
std::thread special_thread([message](std::string msg) {
// 1. Выводит сообщение
std::cout << "Специальный поток получил: " << msg << "\n";
// 2. Ждёт 3 секунды
std::this_thread::sleep_for(std::chrono::seconds(3));
// 3. Выводит "Специальный поток завершил работу"
std::cout << "Специальный поток завершил работу\n";
}, message);
// Добавляем специальный поток в вектор (чтобы потом дождаться его)
threads.push_back(std::move(special_thread));
// TODO: дождитесь завершения всех потоков (в цикле вызывая join)
for (auto& t : threads) {
if (t.joinable()) {
t.join();
}
}
std::cout << "Главный поток завершён!\n";
return 0;
}