u201014434曾三桀-(2)Word格式.doc
《u201014434曾三桀-(2)Word格式.doc》由会员分享,可在线阅读,更多相关《u201014434曾三桀-(2)Word格式.doc(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<
stdio.h>
stdlib.h>
pthread.h>
unistd.h>
time.h>
sys/time.h>
#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(&
}
//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);
end,NULL);
//结束运行时间
period=1000000*(end.tv_sec-begin.tv_sec)+end.tv_usec-begin.tv_usec;
period/=1000000;
//运算时间为微秒
printf("
multithreadRuntime:
%.9fseconds\n"
period);
Thesumis:
%.4f\n"
sum);
return0;
运行结果:
多线程有睡眠运行结果:
单线程程序代码:
//singlethread.c
voidthread_child(void)
1000000;
i++)
//sleep(4);
pthread_tchild;
intret;
//子线程标号
ret=pthread_create(&
child,NULL,(void*)thread_child,NULL);
if(ret!
pthread_join(child,NULL);
//运行结束时间
period=1000000*(end.tv_sec-begin.tv_sec)+end.tv_usec-begin.tv_usec;
SinglethreadRuntime:
Thesumis:
单线程无睡眠运行结构:
结果分析:
无睡眠时,多线程所需时间比单线程略微多一点;
由于该实验是十万数的计算,均依靠CPU,所以多线程并没有优势,反而在切换线程的时候多消耗了部分时间;
但由于计算机产生的数不同,可能与预测的时间大小比较有一点点出入。
有睡眠时,多线程时间明显少很多;
这是由于多线程运行时,当有某一程序睡眠时可让其他线程运行因此节省了很多时间。
参考文献:
MultithreadedProgrammingAssignment.pdf
MultithreadedProgrammingGuide.pdf
心得体会:
通过这次实验,我对于Linux下的编程有了一个初步的了解(vi编辑器好像很好用),并且较为熟练地掌握了程序的编译执行过程。
通过比较这次实验的结果,我充分认识到了“纸上得来终觉浅”,学以致用才能更好地帮助我理解;
从运行结果图可以看出,多线程程序并不一定比单线程程序快了很多,反而由于切换线程可能导致多余的消耗时间。
这次试验的经验有利于我在今后的学习中编写出更优秀的代码。