u201014434曾三桀-(2)Word格式.doc

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

u201014434曾三桀-(2)Word格式.doc

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

u201014434曾三桀-(2)Word格式.doc

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

通过比较这次实验的结果,我充分认识到了“纸上得来终觉浅”,学以致用才能更好地帮助我理解;

从运行结果图可以看出,多线程程序并不一定比单线程程序快了很多,反而由于切换线程可能导致多余的消耗时间。

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

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

当前位置:首页 > 高等教育 > 法学

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

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