ВУЗ:
Составители:
7
помещает данные в буфер и увеличивает значение count.
Код программы потребителя прост: сначала проверить, не равно ли значение
count нулю. Если равно, то уйти в состояние ожидания; иначе забрать порцию
данных из буфера и уменьшить значение count. Каждый из процессов также должен
проверять, не следует ли активизировать другой процесс, и в случае необходимости
проделывать это. Программы обоих процессов представлены в листинге 1.
#define N 100
int count = 0;
void producer()
{
int item;
while (TRUE) {
item=produce_item(); //сформировать следующий элемент
if (count==N) sleep(); //буфер полон – состояние ожидания
insert_item(item); //поместить элемент в буфер
count++;
if (count==1) wakeup(consumer);
}
}
void consumer()
{
int item;
while (TRUE) {
if (count==0) sleep(); //буфер пуст – состояние ожидания
item=remove_item(item); //забрать элемент из буфера
count--;
if (count==N-1) wakeup(producer);
}
}
Листинг 1 – Проблема производителя и потребителя с неустранимым
состоянием соревнования
Для описания на языке С системных вызовов sleep и wakeup мы представили
их в виде вызовов библиотечных процедур. В стандартной библиотеке С их нет, но
они будут доступны в любой системе, в которой присутствуют такие системные
вызовы. Процедуры insert_item и remove_item помещают элементы в буфер и
извлекают их оттуда.
Возникновение состояния состязания возможно, поскольку доступ к
переменной count не ограничен. Может возникнуть следующая ситуация: буфер
пуст, и потребитель только что считал значение переменной count, чтобы
проверить, не равно ли оно нулю. В этот момент планировщик передал управление
производителю, производитель поместил элемент в буфер и увеличил значение
count, проверив, что теперь оно стало равно 1. Зная, что перед этим оно было равно
0 и потребитель находился в состоянии ожидания, производитель активизирует его с
помощью вызова wakeup.
помещает данные в буфер и увеличивает значение count.
Код программы потребителя прост: сначала проверить, не равно ли значение
count нулю. Если равно, то уйти в состояние ожидания; иначе забрать порцию
данных из буфера и уменьшить значение count. Каждый из процессов также должен
проверять, не следует ли активизировать другой процесс, и в случае необходимости
проделывать это. Программы обоих процессов представлены в листинге 1.
#define N 100
int count = 0;
void producer()
{
int item;
while (TRUE) {
item=produce_item(); //сформировать следующий элемент
if (count==N) sleep(); //буфер полон – состояние ожидания
insert_item(item); //поместить элемент в буфер
count++;
if (count==1) wakeup(consumer);
}
}
void consumer()
{
int item;
while (TRUE) {
if (count==0) sleep(); //буфер пуст – состояние ожидания
item=remove_item(item); //забрать элемент из буфера
count--;
if (count==N-1) wakeup(producer);
}
}
Листинг 1 – Проблема производителя и потребителя с неустранимым
состоянием соревнования
Для описания на языке С системных вызовов sleep и wakeup мы представили
их в виде вызовов библиотечных процедур. В стандартной библиотеке С их нет, но
они будут доступны в любой системе, в которой присутствуют такие системные
вызовы. Процедуры insert_item и remove_item помещают элементы в буфер и
извлекают их оттуда.
Возникновение состояния состязания возможно, поскольку доступ к
переменной count не ограничен. Может возникнуть следующая ситуация: буфер
пуст, и потребитель только что считал значение переменной count, чтобы
проверить, не равно ли оно нулю. В этот момент планировщик передал управление
производителю, производитель поместил элемент в буфер и увеличил значение
count, проверив, что теперь оно стало равно 1. Зная, что перед этим оно было равно
0 и потребитель находился в состоянии ожидания, производитель активизирует его с
помощью вызова wakeup.
7
Страницы
- « первая
- ‹ предыдущая
- …
- 5
- 6
- 7
- 8
- 9
- …
- следующая ›
- последняя »
