Информатика и технология программирования

Формы для выпечки оптом тут. |

Синхронизация процессов - часть 2


}
}}


void V(int *sem) // Увеличить семафор


{ RUN++; (*sem)++; RUN--; // Выйти (с переключением процессов)


NOCLOCK++; geninterrupt(TIMVEC);
}
В заключение приведем пример решения классической задачи " поставщик - потребитель" , взаимодействующих через общий циклический буфер .


&#35define N 5 // Размер буфера


&#35define 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(&#38FULL); // P(Буфер не пуст)


P(&#38SEMBUF); // P(Операция с буфером )


char s=BUFF[fst]; // Получить из буфера


fst=(fst+1)%N; // и вывести


textbackground(BLUE);
putch(s);
V(&#38SEMBUF); // V(Операция с буфером )


V(&#38EMPTY); // V(Буфер не полон )


}}


void produce() // Процесс - производитель


{ while(1)
{
if (kbhit()) { // Если есть ввод


char c=getch();
textbackground(BLACK);
putch(c);
if (c=='\r') STOP++;
P(&#38EMPTY); // P(Буфер не полон )


P(&#38SEMBUF); // P(Операция с буфером )


textbackground(MAGENTA);
putch(c);
BUFF[lst]=c; // Поместить в буфер


lst=(lst+1)%N;
V(&#38SEMBUF); // V(Операция с буфером )


V(&#38FULL); // V(Буфер не пуст )


}}}





Начало  Назад  Вперед



Книжный магазин