ВОРОТА | ВОРОТА КС 2021 | Набор 1 | Вопрос 56
Рассмотрим следующий псевдокод, где 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 вызовет взаимоблокировку.
Итак, вариант (Г) верен.
Викторина этого вопроса