Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Никитина Дарья ПИН 31Д

.docx
Скачиваний:
2
Добавлен:
16.07.2021
Размер:
49.43 Кб
Скачать

Зачетная работа

операционные системы и сети

никитина дарья пин 31д

Задание

Решение

В данном случае в обоих функциях циклы while не имеют тела, то есть ничего не выполняют, а только проверяют корректность счётчиков в данный момент времени. При этом последующие прием или передача информации и увеличение счетчиков будут выполнены только для одного элемента, а не для всех возможных. Это не является корректной работой буффера, а также может привести к двум ситуациям, когда программа не сможет завершить работу:

  1. Функция Put была вызвана N раз, но за это время ни разу не была вызвана функция Get. Массив buffer уже полностью заполнен новой информацией, условие (np-nc)>=N выполнится и процесс уйдет в режим ожидания, пока снова не будет запущена функция Get. Но если функцию Get не запустить в этом случае, то программа не сможет завершить работу, так как цикл в функции Put будет работать бесконечно.

  2. Функцией Get уже были переданы все элементы массива buffer, и она запущена снова. В этом случае условие (nc-np)>=0 будет верным, значит, процесс уйдет в режим ожидания, пока не будет запущена функция Put. Но если так и не вызвать функцию Put, то аналогично программа не сможет завершить работу, так как теперь уже цикл в функции Get будет работать бесконечно.

Изменить в функциях нужно следующее: условия поменять на противоположные (тогда в цикл мы будем заходить тогда, когда есть место для приема информации или есть непереденная информация), а следующие строки поместить в тело цикла (тогда в функции Put будут записываться числа во все элементы массива buffer, которые уже были переданы, а в функции Get будут передаваться все элементы массива buffer, которые ранее не были переданы).

Корректный код программы будет выглядеть следующим образом:

class Buf {

int buffer[N];

int np, nc;

public:

Buf() { np = 0; nc = 0; }

void Put(int v);

void Get(int& v);

};

void Buf::Put(int v)

{

while ((np - nc) < N)

{

buffer[np % N] = v;

np++;

}

}

void Buf::Get(int& v)

{

while ((nc - np) < 0)

{

v = buffer[nc % N];

nc++;

}

}