您好,欢迎访问三七文档
1/14北京XX大学2014学年—2015学年第1学期Linux应用实验报告书实验题目:实验四Linux多线程实验环境:一台装有vmware和redhet的PC机实验目的:主要通过编写经典的“生产者/消费者”问题的实验,可以进一步熟悉Linux多线程编程。实验内容:1.主线程与子线程的关系#include<stdio.h>#include<pthread.h>voidchildthread(){inti;for(i=0;i3;i++){printf(Thisisapthread.\n);sleep(2);}}intmain(){pthread_tid;pthread_create(&id,NULL,(void*)childthread,NULL);for(i=0;i3;i++)printf(Thisisthemainprocess.\n);pthread_join(id,NULL);//等待子线程结束return(0);}2/14如果去掉上述程序中的等待子线程结束行,程序的运行结果又会有怎样的结果?请解释其中的原因。3/142.“生产者/消费者”问题描述:4/14有一个有限缓冲区和两个线程:生产者和消费者。他们分别把产品放入缓冲区和从缓冲区中拿走产品。当一个生产者在缓冲区满时必须等待,当一个消费者在缓冲区空时也必须等待。Ⅰ)但是极端情况下,生产者每次都加锁成功,那缓冲区会满,产品无法放入缓冲区。消费者会被饿死,因为他一直无法获得互斥量。代码提示:#defineNUMS10//表示生产,消费的次数#defineCAPACITY5//定义缓冲区最大值intcapacity=0;//当前缓冲区的产品个数pthread_mutex_tmylock=PTHREAD_MUTEX_INITIALIZER;//互斥量void*produce(void*args){pthread_mutex_lock(&mylock);pthread_mutex_unlock(&mylock);}void*consume(void*args){pthread_mutex_lock(&mylock);pthread_mutex_unlock(&mylock);5/14}intmain(intargc,char**argv){interr;pthread_tproduce_tid,consume_tid;err=pthread_create(&produce_tid,NULL,produce,NULL);err=pthread_create(&consume_tid,NULL,consume,NULL);}代码:6/147/14运行结果:Ⅱ)采用两个互斥量来完成8/14代码:9/1410/14运行结果:11/14Ⅲ)互斥锁的确能很好的实现进程/线程之间的同步问题,但是它是通过锁机制来实现的,就是仅仅通过加锁和解锁实现同步,效率比较低,于是就有了条件变量(ConditionVariable),条件变量允许一个进程或者是线程睡眠直到某个事件为止。互斥锁用于上锁,而条件变量用于等待。条件变量是类型为pthread_cond_t的变量。具体来说条件变量可以适用的情况:在线程同步中存在这样的一种情况,某个线程A需要等待某个条件成立之后才能继续往下执行,如果当前这个条件不成立,那么该线程就阻塞等待,而如果某个时刻另一个线程B在执行的过程中使得这个条件成立了,那么就会唤醒线程A继续往下执行。代码:12/1413/14运行结果:14/14心得和体会:这次实验主要是编写几个关于线程的程序,其中包含经典的“生产者/消费者”问题。在这次实验中遇到的难题都通过上网查找相关资料和请教同学解决问题,使我们进一步熟悉Linux多线程编程。
本文标题:linux实验
链接地址:https://www.777doc.com/doc-2884822 .html