📄 prodcons1.c
字号:
/* include main */#include "unpipc.h"#include "semaphore.h"#define NBUFF 10#define SEM_MUTEX "mutex" /* these are args to px_ipc_name() */#define SEM_NEMPTY "nempty"#define SEM_NSTORED "nstored"int nitems; /* read-only by producer and consumer */struct { /* data shared by producer and consumer */ int buff[NBUFF]; mysem_t *mutex, *nempty, *nstored;} shared;void *produce(void *), *consume(void *);intmain(int argc, char **argv){ pthread_t tid_produce, tid_consume; if (argc != 2) err_quit("usage: prodcons1 <#items>"); nitems = atoi(argv[1]); /* 4create three semaphores */ shared.mutex = Mysem_open(Px_ipc_name(SEM_MUTEX), O_CREAT | O_EXCL, FILE_MODE, 1); shared.nempty = Mysem_open(Px_ipc_name(SEM_NEMPTY), O_CREAT | O_EXCL, FILE_MODE, NBUFF); shared.nstored = Mysem_open(Px_ipc_name(SEM_NSTORED), O_CREAT | O_EXCL, FILE_MODE, 0); Set_concurrency(2); Pthread_create(&tid_produce, NULL, produce, NULL); Pthread_create(&tid_consume, NULL, consume, NULL); Pthread_join(tid_produce, NULL); Pthread_join(tid_consume, NULL); Mysem_unlink(Px_ipc_name(SEM_MUTEX)); Mysem_unlink(Px_ipc_name(SEM_NEMPTY)); Mysem_unlink(Px_ipc_name(SEM_NSTORED)); exit(0);}/* end main *//* include prodcons */void *produce(void *arg){ int i; for (i = 0; i < nitems; i++) { Mysem_wait(shared.nempty); /* wait for at least 1 empty slot */ Mysem_wait(shared.mutex); shared.buff[i % NBUFF] = i; /* store i into circular buffer */ Mysem_post(shared.mutex); Mysem_post(shared.nstored); /* 1 more stored item */ } return(NULL);}void *consume(void *arg){ int i; for (i = 0; i < nitems; i++) { Mysem_wait(shared.nstored); /* wait for at least 1 stored item */ Mysem_wait(shared.mutex); if (shared.buff[i % NBUFF] != i) printf("buff[%d] = %d\n", i, shared.buff[i % NBUFF]); Mysem_post(shared.mutex); Mysem_post(shared.nempty); /* 1 more empty slot */ } return(NULL);}/* end prodcons */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -