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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

精校版生产者程序与流程图.docx

1、精校版生产者程序与流程图(完整word版)生产者程序与流程图 编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整word版)生产者程序与流程图)的内容能够给您的工作和学习带来便利。同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快 业绩进步,以下为(完整word版)生产者程序与流程图的全部内容。程序代码:#include stdio.h /定义头文件include time。

2、hinclude unistd.hinclude sys/ipc。hinclude #include sys/sem.h#define PRODUCER 2 /宏定义生产者个数, 2个define COSTOMER 3 /宏定义消费者个数, 3个define WRITE_NUM 6 /宏定义写缓冲次数, 6次define READ_NUM 4 /宏定义读缓冲次数, 4次define SEM_ALL_KEY 1342 define SEM_EMPTY 0 #define SEM_FULL 1define BUF_LENGTH (sizeof(struct container_buffer)) /

3、宏定义缓冲区大小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() int t; srand((unsigned)(getpid() + time(NULL)); t = rand() % 6; return

4、 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; srand((unsigned)(getpid() + time(NULL)); a = (char)((char)(rand() 15) + !); return a;/

5、V操作,释放使用权void v(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);/主函数int main(int argc, char * argv) int shm_id, sem_id; /定义共享内存段标识变量shm_id,定义信号量标识变量sem_id int num_p = 0, num_c = 0, i, j; /定义生产者和消费者的个数

6、变量,初始化为0 struct container_buffer shmptr; /指向缓冲区结构的指针 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(s

7、em_id, SEM_FULL, SETVAL, 0); /索引为SEM_FULL的信号量值为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) /创建一个进程 exit(1); /失败退出 /如果是子进程,开始创建生产者 if (pid_p = 0) if (shmptr = shmat(shm_id, 0, 0) = (void *)-1) /将共

8、享段与本进程相连 exit(1); /失败退出 for (i = 0; i WRITE_NUM; i+) /循环尝试在缓冲区内放入数据为WRITE_NUM次 p(sem_id, SEM_EMPTY); /p操作,申请使用权,p(empty) sleep(random_num(); /随机等待一段时间 shmptr-lettershmptrtail = pn = random_letter(); /在缓冲队列里面放入一个产品 shmptr-tail = (shmptrtail + 1) % BUFFER_NUM; shmptris_empty = 0; /更新缓冲区状态为满 now = time

9、(NULL); /取得系统时间 printf(”current time: 02d:%02d:%02dt, localtime(now)tm_hour, localtime(&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_NU

10、M); printf(”tProducer %d puts a product named as c。n, num_p, pn); /输出动作序列 fflush(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。n); exit(1); /失

11、败退出 /如果是子进程,开始创建消费者 if (pid_c = 0) if ((shmptr = shmat(shm_id, 0, 0) = (void )1) /将共享段与本进程相连 printf(Error on shmat。n”); exit(1); /失败退出 for (i = 0; i lettershmptrhead; /得到读取的产品标示字符 shmptr-head = (shmptr-head + 1) % BUFFER_NUM; shmptr-is_empty = (shmptrhead = shmptrtail); /更新缓冲区产品状态 now = time(NULL);

12、/得到系统时间 printf(”current time: %02d:%02d:02dt”, localtime(now)-tm_hour, localtime(now)tm_min, localtime(now)tm_sec); for (j = (shmptrtail 1 = shmptr-head) ? (shmptrtail - 1) : (shmptr-tail - 1 + BUFFER_NUM); !(shmptr-is_empty) j = shmptr-head; j-) / 输出缓冲区状态 printf(%c”, shmptrletterj % BUFFER_NUM); pr

13、intf(”tConsumer d gets a product named as %c。n, num_c, pn); fflush(stdout); /清除文件缓存区 v(sem_id, SEM_EMPTY); shmdt(shmptr); /解除共享段与本进程的连接 exit(0); /主控程序最后退出 while(wait(0) != -1); /等待子进程结束 shmdt(shmptr); /接触父进程和共享段的连接 shmctl(shm_id, IPC_RMID, 0); /删除共享内存段 semctl(sem_id, IPC_RMID, 0); printf(”Main proce

14、ss ends.n); fflush(stdout); /清除文件缓存区 exit(0);生产者流程图:生产者线程开始资源信号量P操作互斥信号量P操作生产一个产品把产品送入缓冲区互斥信号量V操作资源信号量V操作等待队列中有消费者线程等待队列中有消费者线程线程自我阻塞添加到等待队列线程自我阻塞添加到等待队列未通过未通过通过通过唤醒对头的消费者线程唤醒对头的消费者线程生产者线程结束YYNN消费者流程图:消费者线程开始资源信号量P操作互斥信号量P操作从缓冲区取出一个产品消费一个产品互斥信号量V操作资源信号量V操作等待队列中有生产者线程等待队列中有生产者线程线程自我阻塞添加到等待队列线程自我阻塞添加到等待队列未通过未通过通过通过唤醒对头的生产者线程唤醒对头的生产者线程消费者线程结束YYNN主程序流程图:运行结果如下:

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

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