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