В заключение приведем пример решения
}
}}
void V(int *sem) // Увеличить семафор
{ RUN++; (*sem)++; RUN--; // Выйти (с переключением процессов)
NOCLOCK++; geninterrupt(TIMVEC);
}
В заключение приведем пример решения классической задачи " поставщик - потребитель" , взаимодействующих через общий циклический буфер .
#define N 5 // Размер буфера
#define TW 18*2 // Время " работы" потребителя
int EMPTY=N, // Семафор " БУФЕР ПОЛОН"
FULL=0, // Семафор " БУФЕР ПУСТ"
SEMBUF=1; // Семафор " ОПЕРАЦИЯ С БУФЕРОМ"
int fst=0,lst=0; // Циклическая очередь
char BUFF[N];
void consume() // Процесс - потребитель
{ while(1)
{ WAIT(TW); // Процесс " работает"
P(&FULL); // P(Буфер не пуст)
P(&SEMBUF); // P(Операция с буфером )
char s=BUFF[fst]; // Получить из буфера
fst=(fst+1)%N; // и вывести
textbackground(BLUE);
putch(s);
V(&SEMBUF); // V(Операция с буфером )
V(&EMPTY); // V(Буфер не полон )
}}
void produce() // Процесс - производитель
{ while(1)
{
if (kbhit()) { // Если есть ввод
char c=getch();
textbackground(BLACK);
putch(c);
if (c=='\r') STOP++;
P(&EMPTY); // P(Буфер не полон )
P(&SEMBUF); // P(Операция с буфером )
textbackground(MAGENTA);
putch(c);
BUFF[lst]=c; // Поместить в буфер
lst=(lst+1)%N;
V(&SEMBUF); // V(Операция с буфером )
V(&FULL); // V(Буфер не пуст )
}}}
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий