系统平台实验7-线程同步与多线程编程

系统平台实验7-线程同步与多线程编程

ID:14207460

大小:83.00 KB

页数:6页

时间:2018-07-26

上传者:U-3745
系统平台实验7-线程同步与多线程编程_第1页
系统平台实验7-线程同步与多线程编程_第2页
系统平台实验7-线程同步与多线程编程_第3页
系统平台实验7-线程同步与多线程编程_第4页
系统平台实验7-线程同步与多线程编程_第5页
资源描述:

《系统平台实验7-线程同步与多线程编程》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

实验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#defineFIFO"myfifo"#defineN5intlock_var;time_tend_time;charbuf_r[100];定义buf_r数组表示缓冲区sem_tmutex,full,empty;互斥信号量木特性,信号量empty表示缓冲池中空幻吃区适量,full表示满缓冲区适量intfd;voidproducer(void*arg);voidconsumer(void*arg);6 intmain(intargc,char*argv[]){pthread_tid1,id2;pthread_tmon_th_id;intret;end_time=time(NULL)+10;创建管道if((mkfifo(FIFO,0777|O_CREAT)<0)&&(errno!=EEXIST))printf("cannotcreatfifoserver ");printf("Preparingforreadingbytes ");memset(buf_r,0,sizeof(buf_r));打开管道fd=open(FIFO,O_RDWR|O_NONBLOCK,0);if(fd==-1){perror("open");exit(1);}初始化互斥信号和emptyfull缓冲区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);创建生产者线程创建成功返回0if(ret!=0)perror("pthreadcreate1");ret=pthread_create(&id2,NULL,(void*)consumer,NULL);创建消费者线程创建成功返回0.if(ret!=0)perror("pthreadcreate2");pthread_join(id1,NULL);等待生产者线程结束pthread_join(id2,NULL);等待消费者县城结束exit(0);}voidproducer(void*arg){inti,nwrite;while(time(NULL)6 #includeintvalue=0;void*runner(void*param);intmain(intargc,char*argv[]){intpid;pthread_ttid;定义一个线程标识符pthread_attr_tattr;pid=fork();给父进程fork一个子进程if(pid==0){pthread_attr_init(&attr);初始化进程变量pthread_create(&tid,&attr,runner,NULL);pthread_join(tid,NULL);等待tid线程运行结束,然后开始运行printf("CHILD:value=%d ",value);}elseif(pid>0){wait(NULL);printf("PARENT:value=%d ",value);}}void*runner(void*param)定义一个线程函数{value=5;pthread_exit(0);}实验任务:写出程序运行结果,并给出具体分析(为什么会出现这样的结果),通过这个程序深入理解进程和线程的运行机制。答:程序开始赋值给value为0,而pid进程的运行函数任务是给value赋值为5。然后执行子线程,输出:CHILD:value=5.最后执行父线程输出:PARENT:value=06 三、实验内容及步骤第一:首先创建管道,然后初始化缓冲区,之后打开管道初始化互斥信号量和empty和full缓冲区,最后创建生产者和消费者线程。第二:定义一个线程并初始化为默认值,之后定义一个父进程给父进程fork一个子进程,最后定义一个线程运行程序并运行程序。四心得体会通过这次试验我感觉很多东西都不知道,然后做实验的时候,函数都是自己慢慢查资料的,这次试验至少也让我对进程和线程的结合使用有了更直观的认识。了解了系统中线程同步的基本原理。6

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭