From 92f1faf36da944ac0489588dc1958ef67e76186e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=B8=D1=82=D0=B0=20=D0=A3=D1=82=D0=BA?= =?UTF-8?q?=D0=B8=D0=BD?= Date: Thu, 25 May 2023 17:51:21 +0000 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=B8?= =?UTF-8?q?=D0=BB(=D0=B0)=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20''?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.c | 36 ++++++++++++++++++++++++++++++++++++ race.c | 39 +++++++++++++++++++++++++++++++++++++++ race.h | 25 +++++++++++++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 main.c create mode 100644 race.c create mode 100644 race.h diff --git a/main.c b/main.c new file mode 100644 index 0000000..d3a4145 --- /dev/null +++ b/main.c @@ -0,0 +1,36 @@ +#include +#include +#include "race.h" + +int main() { + pthread_t participants[NUM_PARTICIPANTS]; + int participant_ids[NUM_PARTICIPANTS]; + + // Инициализация мьютекса и условных переменных + pthread_mutex_init(info->tunnel_mutex, NULL); + pthread_cond_init(info->start_cond, NULL); + pthread_cond_init(info->finish_cond, NULL); + + // Создание участников гонки + for (int i = 0; i < NUM_PARTICIPANTS; i++) { + participant_ids[i] = i + 1; + pthread_create(&participants[i], NULL, participant, &participant_ids[i]); + } + + // Ожидание завершения гонки + pthread_mutex_lock(info->tunnel_mutex); + while (info->participants_finished < NUM_PARTICIPANTS) { + // Ждем, пока все участники не закончат гонку + pthread_cond_wait(info->finish_cond, info->tunnel_mutex); + } + pthread_mutex_unlock(info->tunnel_mutex); + + printf("Гонка завершена! Победитель - участник %d\n", participant_ids[NUM_PARTICIPANTS - 1]); + + // Очистка ресурсов + pthread_mutex_destroy(info->tunnel_mutex); + pthread_cond_destroy(info->start_cond); + pthread_cond_destroy(info->finish_cond); + + return 0; +} diff --git a/race.c b/race.c new file mode 100644 index 0000000..2ed779f --- /dev/null +++ b/race.c @@ -0,0 +1,39 @@ +// +// Created by mrnek on 25.05.2023. +// +#include "race.h" + +void * participant(void *arg) { // Функция для участника гонки + info->participants_in_tunnel = 0; + info->participants_finished = 0; + int participant_id = *(int *)arg; + + // Подготовка участника + printf("Участник %d готовится к гонке\n", participant_id); + + // Ожидание начала гонки + pthread_mutex_lock(info->tunnel_mutex); + while (info->participants_in_tunnel >= TUNNEL_CAPACITY) { + // Ждем, пока не освободится место в тоннеле + pthread_cond_wait(info->start_cond, info->tunnel_mutex); + } + info->participants_in_tunnel++; + pthread_mutex_unlock(info->tunnel_mutex); + + printf("Участник %d начинает гонку\n", participant_id); + + // Гонка + + // Завершение гонки + pthread_mutex_lock(info->tunnel_mutex); + info->participants_finished++; + if (info->participants_finished == NUM_PARTICIPANTS) { + // Если все участники закончили гонку, уведомляем о завершении + pthread_cond_broadcast(info->finish_cond); + } + pthread_mutex_unlock(info->tunnel_mutex); + + printf("Участник %d закончил гонку\n", participant_id); + + pthread_exit(NULL); +} \ No newline at end of file diff --git a/race.h b/race.h new file mode 100644 index 0000000..8a2e107 --- /dev/null +++ b/race.h @@ -0,0 +1,25 @@ +// +// Created by mrnek on 25.05.2023. +// +#include +#include +#include + +#ifndef DATA_RACE_MUTEX_H +#define DATA_RACE_MUTEX_H + +#define NUM_PARTICIPANTS 10 +#define TUNNEL_CAPACITY (NUM_PARTICIPANTS / 2) + +struct race_info { + pthread_mutex_t *tunnel_mutex; // Мьютекс для обеспечения взаимного исключения + pthread_cond_t *start_cond, *finish_cond; // Условные переменные для ожидания начала и завершения гонки + int participants_in_tunnel; // Количество участников в тоннеле + int participants_finished ; // Количество закончивших гонку участников +}; + +struct race_info *info; + +void * participant(void *arg); // Функция для участника гонки + +#endif //DATA_RACE_MUTEX_H