Листинг 10.13. Функция, выполняемая всеми потоками-производителями
//pxsem/prodcons3.c
43 void *
44 produce(void *arg)
45 {
46 for (;;) {
47 Sem_wait(&shared.nempty); /* ожидание освобождения поля */
48 Sem_wait(&shared.mutex);
49 if (shared.nput >= nitems) {
50 Sem_post(&shared.nempty);
51 Sem_post(&shared.mutex);
52 return(NULL); /* готово */
53 }
54 shared.buff[shared.nput % NBUFF] = shared.nputval;
55 shared.nput++;
56 shared.nputval++;
57 Sem_post(&shared.mutex);
58 Sem_post(&shared.nstored); /* еще один элемент */
59 *((int *) arg) += 1;
60 }
61 }