Листинг 10.9. Функции produce и consume
//pxsem/prodcons1.c
39 void *
40 produce(void *arg)
41 {
42 int i;
43 for (i = 0; i < nitems; i++) {
44 Sem_wait(shared.nempty); /* ожидаем освобождения поля */
45 Sem_wait(shared.mutex);
46 shared.buff[i % NBUFF] = i; /* помещаем i в циклический буфер */
47 Sem_post(shared.mutex);
48 Sem_post(shared.nstored); /* сохраняем еще 1 элемент */
49 }
50 return(NULL);
51 }
52 void *
53 consume(void *arg)
54 {
55 int i;
56 for (i = 0; i < nitems; i++) {
57 Sem_wait(shared.nstored); /* ожидаем появления объекта в буфере */
58 Sem_wait(shared.mutex);
59 if (shared.buff[i % NBUFF] != i)
60 printf("buff[%d] = %d\n", i, shared.buff[i % NBUFF]);
61 Sem_post(shared.mutex);
62 Sem_post(shared.nempty); /* еще одно пустое поле */
63 }
64 return(NULL);
65 }