实验七——线程同步及多线程编程

实验七——线程同步及多线程编程

ID:41614337

大小:212.90 KB

页数:8页

时间:2019-08-28

上传者:U-7604
实验七——线程同步及多线程编程_第1页
实验七——线程同步及多线程编程_第2页
实验七——线程同步及多线程编程_第3页
实验七——线程同步及多线程编程_第4页
实验七——线程同步及多线程编程_第5页
资源描述:

《实验七——线程同步及多线程编程》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

实验七线程同步与多线程编程实验目的:1.了解系统中线程同步的基本原理。2.了解与熟悉多线程编程与线程访问控制。实验内容及步骤:1.生产者与消费者问题:①截图与分析源程序:程序代码注释:#include #include#inelude#include#include#includevsys/ipc・h>#include#include#include#includeh>#defineFIFO"myfifo"#defineN5intlock_var;time_tend_time;charbuf_r[100];//定义buf_r数组表示缓冲区sem_tmutex,fulhempty;//互斥信号量mutex,信号量empty表示缓冲池中空缓冲区数量,full表示满缓冲区数量intfd;voidproducer(void*arg);voidconsumer(void*arg);intmain(intargc^char*argv[]){pthread_tidl,id2;pthread_tmon_th_id;intret;end_time=time(NULL)+10;/*createanamedpipe*/〃创建管道if((mkfifo(FIFO,0777|O_CREAT)<0)&&(errno!=EEXIST))printf(ncannotcreatfifoserver u);printf(11Preparingforreadingbytes ,f);memset(buf_r,0,sizeof(buf_r));/*openthepipe*/〃打开管道fd=open(F!FO,O_RDWR|O_NONBLOCK,0);if(fd==-l){perror(nopenH);exit(l);}/^initializethemutexto1*/〃初始化互斥信号量与empty,full缓冲区ret=sem_init(&mutex,O,l);ret=seni_init(&empty,0,N);ret=sem_init(&full,O,O); if(ret!=O){perror(**sem_init*1);}ret=pthread_create(&idl,NULL,(void*)producer,NULL);//创建producer线程,创建成功返回0if(ret!=O)perror(npthreadcreater1);ret=pthread_create(&id2,NULL,(void*)producer,NULL);//仓U建consumer线程,创建成功返回0if(ret!=O)perror(npthreadcreate2n);pthreadJoin(idl,NULL);//等待producer线程结束pthread_join(id2,NULL);//等待consumer线程结束exit(O);}voidproducer(void*arg){inti,nwrite;while(time(NULL)127行》91列VT1OO数字分析原因:当线程2也改成执行生产者函数时,整个程序就没有消费者线程了,而空缓冲池的最大容量N我们定义了5,所以,在输岀五次uwritehellototheFIFO”之后,缓冲池已满,而同 时没有消费者线程去清空,就不再执行生产者线程了,所以,最后程序的执行结果就是打印出五句"writehellototheFIFO”。2•进程,线程综合运用:程序分析:1.为程序给岀注释:#include#includeintvalue=0;void*runner(void*param)^/*runner函数声明intmain(intargc,char*argv[]){intpid;pthread_ttid;//定乂一个线程标识符为tid pthread_attr_tattr;//设定线程属性pthread_attr_t的变量为attrpid=fork()7/为父进程fork-个子进程,返回值为pidif(pid==0)〃子进程的执仃内容pthread_attr_init(&attr);//对线程属性变量进彳丁初始化,使用默认值pthread_create(&tid,&attr,runner,NULIJ;//仓U―根K识彳寸为tid,线程属性为默认值,线程运行函数起始地址为runner的线程pthreadJoin(tid,NULL);//使子进程一直等待刚创建的tid线程运行结束,才开始继续运行printf(nCHILD:value=%d n,value);)elseif(pid>0)〃父进程的执彳丁内容wait(NULL);printfC'PARENT:value=%d “,value);void*runner(void*param)//自定乂一"个线程运彳丁函数,起始地址为runnervalue=5;pthread.exit(O);} 2.程序运行结果分析:程序开始赋值给value为0,而pid线进程的运行函数runner任务是给value赋值为5。之后在父进程中fork—个子进程,而子进程执行的内容是:创建了pid线程,用pthread」oin()等待pid线程运行结束。所以这时候,value值就变为了5•所以程序先输出:CHILD:5然后执行父进程内容,因为父进程执行内容与子进程无关,所以这时候的value值依然是前面的初始value值0.所以程序接着输出:PARENT:。三.实验心得与体会:做这次实验的时候,感觉很多东西都不知道(可能上课没认真听吧~~~~(>_v)~~~~),然后做实验的时候,一个个函数都是自己慢慢查的,利用查到的资料,慢慢分析程序,给一句句代码写上口己的注释,最后再从整体看程序,理解程序功能含义。感觉在这中间学到了很多东西。突然发现,随着自己一次次实验给老师的代码写注释(我自己在linux下写C程序还是不太会,只能写注释了~~~~(>_v)~~~~),对于linux下的C编程也有了更多的自己的感觉,对于我自己的编程有很大的帮助。除了学到编程体会外,这次试验至少也让我对于线程的同步,与进程,线程的结合使用有了更直观的认识。

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

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

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