欢迎来到天天文库
浏览记录
ID:34499674
大小:33.50 KB
页数:3页
时间:2019-03-07
《跟我学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、,将在后续的章节中陆续向大家交待。通过本章的介绍,相信大家对变量的作用范围有了非常清晰的了解,全局变量、静态变量在多线程中被共享,使得多线程数据交互变得非常便利,这是以多线程方式实现并发编程的一人个重要优势。另一方面,变量共享的方式也会带了一些编程陷阱,如果你刚好陷进去了,将会面临各种意料不到的程序运行问题,这些陷阱是什么,如何避免,将在后续的编程实例中讲解。
此文档下载收益归作者所有