Никитина Дарья ПИН 31Д
.docx
Зачетная работа
операционные системы и сети
никитина дарья пин 31д
Задание
Решение
В данном случае в обоих функциях циклы while не имеют тела, то есть ничего не выполняют, а только проверяют корректность счётчиков в данный момент времени. При этом последующие прием или передача информации и увеличение счетчиков будут выполнены только для одного элемента, а не для всех возможных. Это не является корректной работой буффера, а также может привести к двум ситуациям, когда программа не сможет завершить работу:
Функция Put была вызвана N раз, но за это время ни разу не была вызвана функция Get. Массив buffer уже полностью заполнен новой информацией, условие (np-nc)>=N выполнится и процесс уйдет в режим ожидания, пока снова не будет запущена функция Get. Но если функцию Get не запустить в этом случае, то программа не сможет завершить работу, так как цикл в функции Put будет работать бесконечно.
Функцией 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++;
}
}