Мобильное программирование приложений реального времени в стандарте POSIX


         

Создадим семафоры для охраны вилок


/* пользуется вилкой первого */
/* Зададим реакцию на сигналы и установим будильник */
/* на конец обеда */
sact.sa_handler = stop;
(void) sigemptyset (&sact.sa_mask);
sact.sa_flags = 0;
(void) sigaction (SIGINT, &sact, (
struct sigaction *) NULL);
(void) sigaction (SIGALRM, &sact,
(struct sigaction *) NULL);
alarm (open_room_time);
/* Создадим семафоры для охраны вилок */
semFork = calloc (sizeof (sem_t), nMudr);
for (i = 0; i < nMudr; i++) {
sem_init (&semFork [i], 0, 1 /* На каждое место */
/* по одной вилке */);
}
/* Философы входят в столовую */
for (i = 0; i < nMudr; i++)
pthread_create (&kafedra [i].thread, NULL, &filosof,
(void *) &kafedra [i]);
/* Выдача сообщений на стандартный вывод и выход */
/* после окончания всех задач */
close (pFdIn);
while (1) {
n = read (pFdOut, buffer, LINE_MAX);
if (n == 0 || (n < 0 && errno != EINTR)) break;
for (i = 0; i < n; i++) putchar (buffer [i]);
}
close (pFdOut);
/* Уничтожение семафоров */
for (i = 0; i < nMudr; i++) {
sem_destroy (&semFork [i]);
}
/* Выдача сводной информации */
{
int full_eating_time = 0;
int full_waiting_time = 0;
int full_thinking_time = 0;
for (i = 1; i <= nMudr; i++) {
struct mudrec *this = &kafedra [i - 1];
full_eating_time += this->eat_time;
full_waiting_time += this->wait_time;
full_thinking_time += this->think_time;
if (this->count > 0) {
float count = this->count;
float think_time = this->think_time / count;
float eat_time = this->eat_time / count;
float wait_time = this->wait_time / count;
printf ("%s: ел %d раз в среднем: думал=%.1f "
"ел=%.1f ждал=%.1f (максимум %d)\n",
this->name, this->count, think_time,
eat_time, wait_time, this->max_wait_time);
} else
printf ("%s: не поел\n", this->name);
} /* for */
{
float total_time = (full_eating_time +
full_waiting_time + full_thinking_time) /
(float) nMudr;
printf("Среднее число одновременно едящих = %.3f\n",
full_eating_time / total_time);
printf("Среднее число одновременно ждущих = %.3f\n",
full_waiting_time / total_time);
}
} /* Выдача сводной информации */
free (semFork);
free (kafedra);
/* Сообщим об окончании работы. */
printf ("Конец обеда\n");
return 0;
}

Содержание  Назад  Вперед