文档详情

四多线程应用程序设计.doc

发布:2017-04-22约2.03千字共3页下载文档
文本预览下载声明
四、多线程应用程序设计 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+
显示全部
相似文档