跟我学linux编程-10-多线程编程-变量作用范围

跟我学linux编程-10-多线程编程-变量作用范围

ID:34499674

大小:33.50 KB

页数:3页

时间:2019-03-07

跟我学linux编程-10-多线程编程-变量作用范围_第1页
跟我学linux编程-10-多线程编程-变量作用范围_第2页
跟我学linux编程-10-多线程编程-变量作用范围_第3页
资源描述:

《跟我学linux编程-10-多线程编程-变量作用范围》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、多线程编程-变量在上一章节的多线程简单示例程序上,我们今天稍加一点内容,来展示在多线程环境下,变量的作用范围,代码如下:#include#includeintgcnt=0;voidthread_task(voidarg){intid=(int)arg;intcnt=0;staticscnt=0;while(1){printf("[%d]:%d%d%d",id,cnt,gcnt,scnt);cnt++;gcnt++;scnt++;sleep(1);}returnNULL;}intmain(inta

2、rgc,charargv[]){pthread_tthr;pthread_create(&thr,NULL,thread_task,(void)1);pthread_create(&thr,NULL,thread_task,(void)2);thread_task((void)0);return0;}这么添加的代码非常简单,只改动了三处:第一处改动,我们在程序中添加了一个全局变量:intgcnt=0;第二处改动,我们在线程执行函数thread_task中,添加了一个静态变量:staticscnt=0;;第三处改动,我们在thread_ta

3、sk中,将新添加的两个变量用printf输出,并在每次循环中将其值分别加1:printf("[%d]:%d%d%d",id,cnt,gcnt,scnt);cnt++;gcnt++;scnt++;我们将源码保存为thread1.c,编译程序并执行:gccthread1.c-othread1–lpthread./thread1得到的结果如下:[0]:000[2]:000[1]:000[0]:133[2]:133[1]:155[0]:266[2]:277[1]:288[2]:399[1]:399[0]:399[2]:41212[1]:413

4、13[0]:41414…分析运行结果,我们不难发现,变量cnt的值在每个线程中,都是连续递增的,而变量gcnt与scnt,递增得并不是连续变化,有时候跳3个数,有时候跳两个数。在pthread_task函数中,针对这三个函数,每次循环都是累加1,为什么结果会不相同呢?有两个原则导致这样的运行结果,一是不同类型变量的作用域不同,二是线程切换的时机不同,今天主要讲第一个原因,第二个原因在后续的章节中再讨论。多线程环境下,变量的作用范围为:局部变量,只作用于本线程,为线程所私有,不同线程下的相同变量各有一份独立拷贝;全局变量,作用于整个程序,为

5、所有线程所共享,不同线程下的相同变量是同一份拷贝;静态变量,与全局变量相同。因此,在我们的thread1程序中,变量cnt实际上有三个拷贝,每个线程对应一个,所以语句:cnt++只将线程自己私有的cnt变量值加1,因此对于每个线程而言,它的值是连续变化的。而gcnt与scnt,在程序中各只有一份,三个线程操作的是同一个内容,因此,三个线程各执行一次循环后,其值被累加了3次,因此从宏观上,cnt每累加1,gcnt、scnt被累加3。多次运行thread1,程序输出的结果可能会稍有变化,但上述的结论依然成立。至于程序为什么每次运行结果会有差异

6、,将在后续的章节中陆续向大家交待。通过本章的介绍,相信大家对变量的作用范围有了非常清晰的了解,全局变量、静态变量在多线程中被共享,使得多线程数据交互变得非常便利,这是以多线程方式实现并发编程的一人个重要优势。另一方面,变量共享的方式也会带了一些编程陷阱,如果你刚好陷进去了,将会面临各种意料不到的程序运行问题,这些陷阱是什么,如何避免,将在后续的编程实例中讲解。

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。