u201014434曾三桀-(2).doc

上传人:b****1 文档编号:134410 上传时间:2022-10-04 格式:DOC 页数:8 大小:581KB
下载 相关 举报
u201014434曾三桀-(2).doc_第1页
第1页 / 共8页
u201014434曾三桀-(2).doc_第2页
第2页 / 共8页
u201014434曾三桀-(2).doc_第3页
第3页 / 共8页
u201014434曾三桀-(2).doc_第4页
第4页 / 共8页
u201014434曾三桀-(2).doc_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

u201014434曾三桀-(2).doc

《u201014434曾三桀-(2).doc》由会员分享,可在线阅读,更多相关《u201014434曾三桀-(2).doc(8页珍藏版)》请在冰豆网上搜索。

u201014434曾三桀-(2).doc

课程实验报告

课程名称:

线程控制实验

专业班级:

计算机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编辑器好像很好用),并且较为熟练地掌握了程序的编译执行过程。

通过比较这次实验的结果,我充分认识到了“纸上得来终觉浅”,学以致用才能更好地帮助我理解;从运行结果图可以看出,多线程程序并不一定比单线程程序快了很多,反而由于切换线程可能导致多余的消耗时间。

这次试验的经验有利于我在今后的学习中编写出更优秀的代码。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 党团建设

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1