u201014434曾三桀-(2).doc
- 文档编号:134410
- 上传时间:2022-10-04
- 格式:DOC
- 页数:8
- 大小:581KB
u201014434曾三桀-(2).doc
《u201014434曾三桀-(2).doc》由会员分享,可在线阅读,更多相关《u201014434曾三桀-(2).doc(8页珍藏版)》请在冰豆网上搜索。
课程实验报告
课程名称:
线程控制实验
专业班级:
计算机1109班
学号:
U201014434
姓名:
曾三桀
报告日期:
2013-12-8
计算机科学与技术学院
目的和要求:
通过本实验掌握在Linux操作系统中遵循Posix线程标准接口进行多线程程序编程,熟练掌握线程的创建pthread_create(),线程终止pthread_exit(),等待线程合并pthread_join()等线程控制的操作,利用信号量或者互锁实现线程间的同步。
实验内容:
问题:
求100000个浮点数(精确小数点右4位)的平均值(和、最大值、最小值)
流程图:
步骤:
1、随机生成100000个浮点数;
2、创建4个子线程,分别求25000个浮点数之和;
3、完成100000个浮点数之和并打印结果;
4、统计多线程并发执行完成计算的时间;
5、写一个单线程程序,同样完成10万个随机数求和的计算,统计计算时间,并和前面的结果对比;
6、让单线程程序睡眠四秒钟、多线程程序各子线程睡一秒的条件下(两程序的总睡眠时间相同),对比执行结果;
7、分析两次对比结果的差异,写出自己的见解;
多线程程序代码:
//multithread.c
#include
#include
#include
#include
#include
#include
#defineMAX100000000
doublesum=0.0;
pthread_mutex_tmutex;//pthread_mutex_t
inti;
voidthread_child1(void)
{
for(i=0;i<250000;i++){
pthread_mutex_lock(&mutex);
sum+=(rand()*1.0)/MAX;
pthread_mutex_unlock(&mutex);
}
//sleep
(1);
}
intmain(void)
{
structtimevalbegin,end;
doubleperiod;
pthread_tchild1,child2,child3,child4;
intret1,ret2,ret3,ret4;//四个子线程
pthread_mutex_init(&mutex,0);
gettimeofday(&begin,NULL);//开始运行时间
//创建子线程
ret1=pthread_create(&child1,NULL,(void*)thread_child1,NULL);
ret2=pthread_create(&child2,NULL,(void*)thread_child1,NULL);
ret3=pthread_create(&child3,NULL,(void*)thread_child1,NULL);
ret4=pthread_create(&child4,NULL,(void*)thread_child1,NULL);
if(ret1!
=0||ret2!
=0||ret3!
=0||ret4!
=0)
{
printf("Createpthread_childfaulure!
!
!
\n");
exit
(1);
}
//以下为合并线程
pthread_join(child1,NULL);
pthread_join(child2,NULL);
pthread_join(child3,NULL);
pthread_join(child4,NULL);
gettimeofday(&end,NULL);//结束运行时间
period=1000000*(end.tv_sec-begin.tv_sec)+end.tv_usec-begin.tv_usec;
period/=1000000;//运算时间为微秒
printf("multithreadRuntime:
%.9fseconds\n",period);
printf("Thesumis:
%.4f\n",sum);
return0;
}
运行结果:
多线程有睡眠运行结果:
单线程程序代码:
//singlethread.c
#include
#include
#include
#include
#include
#defineMAX100000000
doublesum=0.0;
inti;
voidthread_child(void)
{
for(i=0;i<1000000;i++)
sum+=(rand()*1.0)/MAX;
//sleep(4);
}
intmain(void)
{
structtimevalbegin,end;
doubleperiod;
pthread_tchild;
intret;//子线程标号
gettimeofday(&begin,NULL);//开始运行时间
//创建子线程
ret=pthread_create(&child,NULL,(void*)thread_child,NULL);
if(ret!
=0)
{
printf("Createpthread_childfaulure!
!
!
\n");
exit
(1);
}
pthread_join(child,NULL);
gettimeofday(&end,NULL);//运行结束时间
period=1000000*(end.tv_sec-begin.tv_sec)+end.tv_usec-begin.tv_usec;
period/=1000000;//运算时间为微秒
printf("SinglethreadRuntime:
%.9fseconds\n",period);
printf("Thesumis:
%.4f\n",sum);
return0;
}
运行结果:
单线程无睡眠运行结构:
结果分析:
无睡眠时,多线程所需时间比单线程略微多一点;由于该实验是十万数的计算,均依靠CPU,所以多线程并没有优势,反而在切换线程的时候多消耗了部分时间;但由于计算机产生的数不同,可能与预测的时间大小比较有一点点出入。
有睡眠时,多线程时间明显少很多;这是由于多线程运行时,当有某一程序睡眠时可让其他线程运行因此节省了很多时间。
参考文献:
MultithreadedProgrammingAssignment.pdf
MultithreadedProgrammingGuide.pdf
心得体会:
通过这次实验,我对于Linux下的编程有了一个初步的了解(vi编辑器好像很好用),并且较为熟练地掌握了程序的编译执行过程。
通过比较这次实验的结果,我充分认识到了“纸上得来终觉浅”,学以致用才能更好地帮助我理解;从运行结果图可以看出,多线程程序并不一定比单线程程序快了很多,反而由于切换线程可能导致多余的消耗时间。
这次试验的经验有利于我在今后的学习中编写出更优秀的代码。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- u201014434 曾三桀