Листинг 10.19. Функции produce и consume
//pxsem/mycat2.c
34 void *
35 produce(void *arg)
36 {
37 int i;
38 for (i = 0;;) {
39 Sem_wait(&shared.nempty); /* Ожидание освобождения места в буфере */
40 Sem_wait(&shared.mutex);
41 /* критическая область */
42 Sem_post(&shared.mutex);
43 shared.buff[i].n = Read(fd, shared.buff[i].data, BUFFSIZE);
44 if (shared.buff[i].n == 0) {
45 Sem_post(&shared.nstored); /* еще один объект */
46 return(NULL);
47 }
48 if (++i >= NBUFF)
49 i = 0; /* кольцевой буфер */
50 Sem_post(&shared.nstored); /* еще один объект */
51 }
52 }
53 void *
54 consume(void *arg)
55 {
56 int i;
57 for (i = 0;;) {
58 Sem_wait(&shared.nstored); /* ожидание появления объекта для обработки */
59 Sem_wait(&shared.mutex);
60 /* критическая область */
61 Sem_post(&shared.mutex);
62 if (shared.buff[i].n == 0)
63 return(NULL);
64 Write(STDOUT_FILENO, shared.buff[i].data, shared.buff[i].n);
65 if (++i >= NBUFF)
66 i=0; /* кольцевой буфер */
67 Sem_post(&shared.nempty); /* освободилось место для объекта */
68 }
69 }