ВОРОТА | ВОРОТА КС 2021 | Набор 1 | Вопрос 56

Опубликовано: 7 Октября, 2022

Рассмотрим следующий псевдокод, где S — это семафор, инициализированный значением 5 в строке № 2, а counter — это общая переменная, инициализированная значением 0 в строке № 1. Предположим, что операция приращения в строке № 7 не является атомарной.

1.  int counter =0;
2.  Semaphore S= init(5);
3.  void parop(void)
4.  {
5.        wait(S);
6.        wait(S);
7.        counter++;
8.        signal(S);
9.        signal(S);
10.  } 

Если пять потоков выполняют функцию parop одновременно, какое из следующих действий программы возможно?
(A) Значение counter равно 5 после того, как все потоки успешно завершили выполнение parop.
(B) Значение counter равно 1 после того, как все потоки успешно завершили выполнение parop
(C) Значение counter равно 0 после того, как все потоки успешно завершили выполнение parop
(D) Возникла тупиковая ситуация, затрагивающая все потоки.

Ответ: (А) (Б) (Г)
Объяснение: Прежде всего, поскольку значение счетчика равно 5, и если для каждого потока есть два ожидания() и два сигнала(). Таким образом, если эти потоки будут завершены, конечное значение счетчика никогда не может быть равно 0.
Итак, вариант (С) неверен.

Значение счетчика 5 возможно, если потоки выполняются в любой последовательности, т. е. один за другим.
Итак, вариант (А) верен.

Значение счетчика 1 также возможно, если поток, который входит в первый и считывает счетчик = 0 и записывает значение счетчика 5 в конце после выполнения всех других потоков.
Итак, вариант (Б) верен.

Пять потоков прерываются после выполнения только первого ожидания (S); строка-5.
Теперь второе ожидание (S); строка-6 вызовет взаимоблокировку.
Итак, вариант (Г) верен.
Викторина этого вопроса

РЕКОМЕНДУЕМЫЕ СТАТЬИ