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


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

#define NUM_THREADS 5

// Структура для передачи параметров в поток
typedef struct {
    int id;          // Порядковый номер потока (1..5)
    int duration;    // Длительность работы в секундах
} ThreadArgs;

// Функция, выполняемая каждым потоком
void* thread_worker(void* arg) {
    ThreadArgs* data = (ThreadArgs*)arg;

    printf("%d-й поток начал работу\n", data->id);
    fflush(stdout);

    // Имитация выполнения задачи заданной длительности
    sleep(data->duration);

    printf("%d-й поток выполнил задачу\n", data->id);
    fflush(stdout);

    return NULL;
}

int main() {
    pthread_t threads[NUM_THREADS];
    ThreadArgs args[NUM_THREADS];
    char choice;

    printf("=== Настройка длительности работы потоков ===\n");
    printf("Введите различное время работы (в секундах) для каждого из %d потоков:\n", NUM_THREADS);

    for (int i = 0; i < NUM_THREADS; i++) {
        args[i].id = i + 1;
        while (1) {
            printf("Длительность для %d-го потока (сек.): ", args[i].id);
            if (scanf("%d", &args[i].duration) == 1 && args[i].duration > 0) {
                while (getchar() != '\n'); // Очистка буфера ввода
                break;
            }
            printf("Ошибка: введите целое положительное число.\n");
            while (getchar() != '\n');
        }
    }

    do {
        printf("\n--- Запуск потоков ---\n");

        // Одновременный запуск 5 потоков
        for (int i = 0; i < NUM_THREADS; i++) {
            if (pthread_create(&threads[i], NULL, thread_worker, &args[i]) != 0) {
                perror("Ошибка при создании потока");
                return EXIT_FAILURE;
            }
        }

        // Ожидание завершения работы всех 5 потоков
        for (int i = 0; i < NUM_THREADS; i++) {
            if (pthread_join(threads[i], NULL) != 0) {
                perror("Ошибка при ожидании завершения потока");
                return EXIT_FAILURE;
            }
        }

        // Запрос дальнейшего действия у пользователя
        while (1) {
            printf("\nНажмите x, чтобы выйти, нажмите r, чтобы перезапустить: ");
            if (scanf(" %c", &choice) == 1) {
                while (getchar() != '\n'); // Очистка буфера ввода
                if (choice == 'x' || choice == 'X' || choice == 'r' || choice == 'R') {
                    break;
                }
            }
            printf("Некорректный ввод! Используйте клавишу 'r' или 'x'.\n");
        }

    } while (choice == 'r' || choice == 'R');

    printf("Работа программы завершена.\n");
    return EXIT_SUCCESS;
}