已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验7 线程同步与多线程编程一、实验目的通过本实验了解和掌握线程的相关知识,使学生(1)了解系统中线程同步的基本原理。(2)了解和熟悉多线程编程及线程访问控制。二、实验内容1. 生产者-消费者问题用信号量实现生产者-消费者问题。分析:信号量的考虑这里使用3个信号量,其中两个信号量empty和full分别用于解决生产者和消费者线程之间的同步问题,mutex是用于这两个线程之间的互斥问题。其中empty初始化为N(缓冲区的单元数),mutex初始化为1,full初始化为0。程序流程如下:1) 开始-建立有名管道-打开有名管道-初始化3个信号量-创建消费者和生产者两个线程。2) 生产者线程。wait操作(empty)-wait操作(mutex)-写管道-signal操作(full)-signal操作(mutex)。3) 消费者线程。请自己实现。源代码:exp71.c#include #include #include #include #include #include #include #include #include #include #define FIFO myfifo#define N 5int lock_var;time_t end_time;char buf_r100;定义buf_r数组表示缓冲区sem_t mutex,full,empty;互斥信号量木特性,信号量empty表示缓冲池中空幻吃区适量,full表示满缓冲区适量int fd;void producer(void *arg);void consumer(void *arg);int main(int argc,char *argv) pthread_t id1,id2; pthread_t mon_th_id; int ret;end_time=time(NULL)+10;创建管道 if(mkfifo(FIFO,0777|O_CREAT)0)&(errno!=EEXIST) printf(cannot creat fifoservern); printf(Preparing for reading bytesn);memset(buf_r,0,sizeof(buf_r);打开管道 fd=open(FIFO,O_RDWR|O_NONBLOCK,0); if(fd=-1) perror(open); exit(1); 初始化互斥信号和empty full缓冲区 ret=sem_init(&mutex,0,1); ret=sem_init(&empty,0,N); ret=sem_init(&full,0,0); if(ret!=0) perror(sem_init); ret=pthread_create(&id1,NULL,(void*)producer,NULL);创建生产者线程创建成功返回0 if(ret!=0) perror(pthread create1); ret=pthread_create(&id2,NULL,(void*)consumer,NULL);创建消费者线程创建成功返回0. if(ret!=0) perror(pthread create2); pthread_join(id1,NULL);等待生产者线程结束 pthread_join(id2,NULL);等待消费者县城结束 exit(0);void producer(void *arg) int i,nwrite; while(time(NULL)end_time) sem_wait(&empty);空缓冲区的信号量减一 sem_wait(&mutex);互斥信号量减一变为0。 if(nwrite=write(fd,hello,5)=-1) if(errno=EAGAIN) printf(The FIFO has not been read yet, please try latern); else printf(write hello to the FIFOn); sem_post(&full);满缓冲区的信号量加一 sem_post(&mutex); sleep(1); void consumer(void *arg)Int nwrite;While(time(NULL)end_time)Sem-wait(&full);Sem-wait(&mutex);If(nwrite=write(fd”hello”,5)=-1)if(errno=EAGAIN)Printf(“The FIFO has not been read yet,please try latern”);ElsePrintf(“read hello to the FIFOn”);Sem-post(&mutex);Sem_post(&empty);Sleep(1); 编译并运行:gcc o exp71 exp71.c lpthread实验任务:(1)读懂源程序,分析各部分含义。答:主函数的主要功能是创建管道,然后初始化缓冲区之后再打开管道,初始化互斥信号量和empty和full缓冲区。之后再分别创建producer线程和consumer线程。(2)将源程序文件中的consumer部分补充完整,写出程序的执行结果。2. 进程、线程综合应用下面程序是一个进程和线程的综合应用实例。阅读源程序完成实验任务。#include #include int value=0;void *runner(void *param);int main(int argc, char* argv) int pid; pthread_t tid;定义一个线程标识符 pthread_attr_t attr; pid=fork();给父进程fork一个子进程 if(pid=0) pthread_attr_init(&attr);初始化进程变量 pthread_create(&tid,&attr,runner,NULL); pthread_join(tid,NULL);等待tid线程运行结束,然后开始运行 printf(CHILD:value=%dn,value); else if(pid0) wait(NULL); printf(PARENT:value=%dn,value); void *runner(void *param)定义一个线程函数 value=5; pthread_exit(0);实验任务:写出程序运行结果,并给出具体分析(为什么会出现这样的结果),通过这个程序深入理解进程和线程的运行机制。答:程序开始赋值给value为0,而pid进程的运行函数任务是给value赋值为5。然后执行子线程,输出:CHILD:value=5.最后执行父线程输出:PARENT:value=0三、实验内容及步骤第一:首先创建管道,然后初始化缓冲区,之后打开管道初始化互斥信号量和empty和full缓冲区,最后创建生产者和消费者线
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 冀少版八年级生物上册第四章微生物在生物圈中的作用课件
- 变量与函数教案
- 《轮轴的秘密》教学设计
- 《莫高窟》教案中涉及的网络资源
- 港口码头施工合同样本
- 医疗设备采购招投标管理台账
- 个性化软件售后服务承诺书
- 水上娱乐设施防水维护合同
- 区块链会所租赁合同模板
- 旅游景区设施增补协议
- 三年级数学(上)计算题专项练习附答案集锦
- 历史期中复习课件七年级上册复习课件(部编版2024)
- 2024秋八年级道德与法治上册 第二单元 遵守社会规则 第五课 做守法的公民 第1框 法不可违说课稿 新人教版
- 2024-2025学年八年级物理上册 4.2光的反射说课稿(新版)新人教版
- 《现代管理原理》章节测试参考答案
- DBJ41T 263-2022 城市房屋建筑和市政基础设施工程及道路扬尘污染防治差异化评价标准 河南省工程建设标准(住建厅版)
- 2024年《保安员》上岗证考试题库190题及答案
- 课堂教学质量评价表
- 第二章 中国的自然环境 综合检测
- 停车收费系统购买合同范本
- 2024年新人教版七年级数学上册教学课件 第六章 几何图形初步 6.1.2 点、线、面、体
评论
0/150
提交评论