四多线程应用程序设计.doc
文本预览下载声明
四、多线程应用程序设计
1、实验目的
了解多线程程序设计的基本原理,学习pthread库函数的使用。
2、实验内容
读懂pthread.c的源代码,熟悉几个重要的PTHREAD库函数的使用。掌握共享锁和信号量的使用方法。
3、预备知识
熟练使用C语言,掌握在Linux下常用编辑器的使用,掌握Makefile的编写和使用,掌握Linux下的程序编译与交叉编译过程。
4、实验设备及工具
硬件:UP-TECHPXA270-S 嵌入式实验仪,PC 机pentumn500 以上, 硬盘10G 以上
软件:PC 机操作系统REDHAT LINUX 9.0 +MINICOM + AMRLINUX 开发环境
5、实验步骤
(1)进入exp/basic/02_pthread目录,使用vi编辑器或其他编辑器阅读理解源代码;
(2)运行make产生pthread可执行文件;
(3)切换到minicom终端窗口,使用NFS mount开发主机的/up-techpxa270到/mnt目录;
(4)进入/mnt/exp/basic/02_pthread目录,运行./pthread,观察运行结果的正确性,若显示结果太快,可以用以下命令输出显示???果到pthread.txt文件./pthread pthread.txt,然后再用cat pthread.txt查看文件内容,结合程序分析结果;
(5)加入一个新的线程用于处理键盘输入,并在按特定字符时终止所有线程。
6、实验报告要求
(1)写清每步实验步骤及具体操作内容;
答:①进入exp/basic/02_pthread目录,使用vi编辑器或其他编辑器阅读理解源代码;
②运行make产生pthread可执行文件;
③切换到minicom终端窗口,使用NFS mount开发主机的/up-techpxa270到/mnt目录;
④进入/mnt/exp/basic/02_pthread目录,运行./pthread,观察运行结果;
⑤由于运行结果太快,用./pthread pthread.txt把运行结果输出到pthread.txt文件中,然后用cat pthread.txt查看文件内容,结合程序分析结果。
(2) 写出程序pthread.c的分析;
答:
生产者写入缓冲区和消费者从缓冲区读数的的过程:生产者首先要获得互斥锁,并且判断写指针+1后是否等于读指针,如果相等则进入等待状态,等候条件变量notfull;如果不等则向缓冲区中写一个整数,并且设置条件变量为notempty,最后释放互斥锁。
同理,消费者线程与生产者线程和以上过程类似,不再具体分析。
(3) 写出修改后的代码并加以说明;
答:代码修改如下
加入一个新的线程变量th_c,并和已有的线程变量th_a、th_b一起改为全局变量(即把th_a、th_b、th_c放到头文件后面);
改写主函数代码
int main(void)
{
pthread_t th_a, th_b;
void * retval;
init(buffer);
pthread_create(th_a, NULL, producer, 0);
pthread_create(th_b, NULL, consumer, 0);
pthread_create(th_c, NULL, presskey, 0);
/* Wait until producer and consumer finish. */
//pthread_join(th_a, retval);注释掉
//pthread_join(th_b, retval);注释掉
pthread_join(th_c, retval);
return 0;
}
编写presskey()函数的具体代码如下
void *presskey(void *data)
{
While(1)
{
if(getchar()==27)
{
pthread_cancel(th_a);
printf(“Producer has stopped!\n”);
pthread_cancel(th_b);
printf(“Consumer has stopped!\n”);
pthread_exit(0);
return NULL;
}
}
}
(4)实验中遇到的问题与解决过程?
答:
遇到问题:
加入新的线程处理键盘输入,按下Esc终止线程时由于程序产生的数字最大是999而程序执行过快来不及按下Esc。
解决办法:
可以把可以产生的最大数字改为9999,即把代码” for (n = 0; n 1000; n+
显示全部