Загрузка данных


#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;
}