ImageVerifierCode 换一换
格式:DOCX , 页数:10 ,大小:51.56KB ,
资源ID:21221193      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/21221193.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(精校版生产者程序与流程图Word文档下载推荐.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

精校版生产者程序与流程图Word文档下载推荐.docx

1、#define SEM_FULL 1define BUF_LENGTH (sizeof(struct container_buffer) /宏定义缓冲区大小define BUFFER_NUM 3 /宏定义缓冲区个数 , 3个 #define SHM_MODE 0600 /宏定义创建和访问标志/缓冲区结构(循环队列)struct container_buffer /定义共享缓冲区结构 char letterBUFFER_NUM; int head; int tail; int is_empty; /判断缓冲区是否为空的标志;/得到6以内的一个随机数,产生延迟时间int random_num()

2、int t; srand(unsigned)(getpid() + time(NULL); t = rand() % 6; return t;/P操作,获得使用权void p(int sem_id, int sem_num) struct sembuf sem_buff; sem_buff.sem_num = sem_num; sem_buff。sem_op = -1; sem_buff.sem_flg = 0; semop(sem_id, &sem_buff, 1);/得到一个随机字符,模拟产品名字char random_letter() char a; a = (char)(char)(r

3、and() 15) + !); return a;/V操作,释放使用权void v(int sem_id, int sem_num) struct sembuf sem_buff; sem_buff.sem_op = 1;sem_buff, 1);/主函数int main(int argc, char * argv) int shm_id, sem_id; /定义共享内存段标识变量shm_id,定义信号量标识变量sem_id int num_p = 0, num_c = 0, i, j; /定义生产者和消费者的个数变量,初始化为0 struct container_buffer shmptr;

4、 /指向缓冲区结构的指针 char pn; /随机字符,代表产品 time_t now; /时间变量 pid_t pid_p, pid_c; /进程pid变量 printf(”Main process starts。n”); sem_id = semget(SEM_ALL_KEY, 2, IPC_CREAT 0660); /创建两个信号量, empty, full semctl(sem_id, SEM_EMPTY, SETVAL, BUFFER_NUM); /索引为SEM_EMPTY的信号量值为3 semctl(sem_id, SEM_FULL, SETVAL, 0); /索引为SEM_FUL

5、L的信号量值为0 if (shm_id = shmget(IPC_PRIVATE, BUF_LENGTH, SHM_MODE) tail = 0; shmptris_empty = 1; while (num_p+) PRODUCER) /循环创建2个生产者 if (pid_p = fork() 0) /创建一个进程 /如果是子进程,开始创建生产者 if (pid_p = 0) if (shmptr = shmat(shm_id, 0, 0) = (void *)-1) /将共享段与本进程相连 exit(1); for (i = 0; i WRITE_NUM; i+) /循环尝试在缓冲区内放入

6、数据为WRITE_NUM次 p(sem_id, SEM_EMPTY); /p操作,申请使用权,p(empty) sleep(random_num(); /随机等待一段时间 shmptr-lettershmptrtail = pn = random_letter(); /在缓冲队列里面放入一个产品tail = (shmptrtail + 1) % BUFFER_NUM;is_empty = 0; /更新缓冲区状态为满 now = time(NULL); /取得系统时间 printf(”current time: 02d:%02d:%02dt, localtime(now)tm_hour, loc

7、altime(&now)tm_min, localtime(&now)-tm_sec); for (j = (shmptr-tail - 1 = shmptr-head) ? (shmptrtail - 1) : (shmptrtail 1 + BUFFER_NUM); !(shmptris_empty) & j = shmptrhead; j-) /输出缓冲区状态 printf(”%c, shmptrletterj BUFFER_NUM); printf(”tProducer %d puts a product named as c。n, num_p, pn); /输出动作序列 fflush

8、(stdout); /清除文件缓存区 v(sem_id, SEM_FULL); /释放对文件的使用权,V(full) shmdt(shmptr); /将共享段与进程之间解除链接 exit(0); /子进程终止 for (;num_c COSTOMER;num_c+) /循环创建COSTOMER个生产者 if (pid_c = fork() 0) /创建一个子进程 printf(Error on fork。 /如果是子进程,开始创建消费者 if (pid_c = 0) if (shmptr = shmat(shm_id, 0, 0) = (void )1) /将共享段与本进程相连Error on

9、 shmat。n”); /失败退出 i lettershmptrhead; /得到读取的产品标示字符head = (shmptr-head + 1) % BUFFER_NUM;is_empty = (shmptrhead = shmptrtail); /更新缓冲区产品状态 now = time(NULL); /得到系统时间 %02d:%02d:02dt”, localtime(now)-tm_hour, localtime(now)tm_min, localtime(now)tm_sec); for (j = (shmptrtail 1 = shmptr-head) ? (shmptrtail

10、 - 1) : (shmptr-tail - 1 + BUFFER_NUM); !(shmptr-is_empty) j = shmptr-head; j-) / 输出缓冲区状态%c”, shmptrletterj % BUFFER_NUM); printf(”tConsumer d gets a product named as %c。, num_c, pn); v(sem_id, SEM_EMPTY); shmdt(shmptr); /解除共享段与本进程的连接 exit(0); /主控程序最后退出 while(wait(0) != -1); /等待子进程结束 /接触父进程和共享段的连接 shmctl(shm_id, IPC_RMID, 0); /删除共享内存段 semctl(sem_id, IPC_RMID, 0); printf(”Main process ends.n生产者流程图:生产者线程开始资源信号量P操作互斥信号量P操作生产一个产品把产品送入缓冲区互斥信号量V操作资源信号量V操作等待队列中有消费者线程线程自我阻塞添加到等待队列未通过通过唤醒对头的消费者线程生产者线程结束YN消费者流程图:消费者线程开始从缓冲区取出一个产品消费一个产品等待队列中有生产者线程唤醒对头的生产者线程消费者线程结束主程序流程图:运行结果如下:

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1