Листинг 10.8. Функция main для решения задачи производителей и потребителей с помощью семафоров
//pxsem/prodcons1.с
1 #include "unpipc.h"
2 #define NBUFF 10
3 #define SEM_MUTEX "mutex" /* аргументы px_ipc_name() */
4 #define SEM_NEMPTY "nempty"
5 #define SEM_NSTORED "nstored"
6 int nitems; /* read-only для производителя и потребителя */
7 struct { /* разделяемые производителем и потребителем данные */
8 int buff[NBUFF];
9 sem_t *mutex, *nempty, *nstored;
10 } shared;
11 void *produce(void *), *consume(void *);
12 int
13 main(int argc, char **argv)
14 {
15 pthread_t tid_produce, tid_consume;
16 if (argc != 2)
17 err_quit("usage: prodcons1 <#items>");
18 nitems = atoi(argv[1]);
19 /* создание трех семафоров */
20 shared.mutex = Sem_open(Px_ipc_name(SEM_MUTEX), O_CREAT | O_EXCL,
21 FILE_MODE, 1);
22 shared.nempty = Sem_open(Px_ipc_name(SEM_NEMPTY), 0_CREAT | O_EXCL,
23 FILE_MODE, NBUFF);
24 shared.nstored = Sem_open(Px_ipc_name(SEM_NSTORED), O_CREAT | O_EXCL,
25 FILE_MODE, 0);
26 /* создание одного потока-производителя и одного потока-потребителя */
27 Set_concurrency(2);
28 Pthread_create(&tid_produce, NULL, produce, NULL);
29 Pthread_create(&tid_consume, NULL, consume, NULL);
30 /* ожидание завершения работы потоков */
31 Pthread_join(tid_produce, NULL);
32 Pthread_join(tid_consume, NULL);
33 /* удаление семафоров */
34 Sem_unlink(Px_ipc_name(SEM_MUTEX));
35 Sem_unlink(Px_ipc_name(SEM_NEMPTY));
36 Sem_unlink(Px_ipc_name(SEM_NSTORED));
37 exit(0);
38 }