跟我学linux编程-11-多线程编程-竞争

跟我学linux编程-11-多线程编程-竞争

ID:34499684

大小:51.00 KB

页数:4页

时间:2019-03-07

跟我学linux编程-11-多线程编程-竞争_第1页
跟我学linux编程-11-多线程编程-竞争_第2页
跟我学linux编程-11-多线程编程-竞争_第3页
跟我学linux编程-11-多线程编程-竞争_第4页
资源描述:

《跟我学linux编程-11-多线程编程-竞争》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、多线程编程-变量在上几个章节关于Linux多线程示例程序的运行结果描述过程中,细心的同志可能已经发现,我几乎每次的措辞都是“运行结果大致为”。在单线程的编程环境上,如果输入条件一样,程序中又没有随机处理逻辑,那么程序的运行结果是非常精确的,每次都会一样。在多线程中,“程序每次运行,结果精确相同”的结论不再成立,因为各个线程中存在竞争,导致程序进入不可完全预测的分支或执行顺序,从而每次运行的结果可能(注意不是一定)会有变化。今天,我将通过一个简单的示例,要向大家展示,“竞争”是怎么一回事。示例程序还是和上前边的章节相同,只做了

2、一些简单的改动。代码如下:#include#include#includeintgcnt=0;void*thread_task(void*arg){intid=(int)arg;while(1){gcnt++;if(gcnt%2){if(!(gcnt%2))printf("[%d]:%d",id,gcnt);}usleep(1);}returnNULL;}intmain(intargc,char*argv[]){pthread_tthr;pthread_crea

3、te(&thr,NULL,thread_task,(void*)1);pthread_create(&thr,NULL,thread_task,(void*)2);thread_task((void*)0);return0;}在线程执行函数thread_task中,我们每次循环对全局变量gcnt的值进行递增,紧接着做了两个条件判断,如果两次条件都成立,则将gcnt的值打印出来,我们来分析这两个判断条件:if(gcnt%2){if(!(gcnt%2))printf("[%d]:%d",id,gcnt);}if(gcnt%2

4、)在gcnt为奇数是为真,而if(!(gcnt%2))在gcnt为偶数时为真,两个条件做双重判断,就是说当gcnt即为奇数又为偶数的时候条件才成立,显然,这是一个不可能的事情,那么,gcnt的值永远不会被打印。结果是这样的吗?我们先不去猜测,编译程序运行一下结果就知道了:gccthread2.c-othread2–lpthread./thread2程序运行后,可能要等很久,也可能没过多久,屏幕上会突然输出如下的信息:[1]:775816[1]:1558050[0]:1617036[1]:1655538[0]:1667332[

5、1]:1680268[0]:1681388…如果发现程序有输出,我们可以按Ctrl+c终止程序。不可能发生的事情居然发生了!!!!!难道是因为我们看电脑太久,眼花了吗????如果不相信,可以再执行一次,你可能又会得到下面这样的结果:[0]:33876[2]:346190[0]:545698[1]:641654…结果还是出人意料,如果还是不信,你可以Ctrl+c杀掉程序,接着再试。我以人格向同志们保证:每次程序多少会输出一些内容,而且每次输出的内容几乎都不相同(如果有某两甚至多次结果相同,也不必惊讶,因这这也是有可能的)。“不

6、可能”发生的事情多次发生,那么也就成了事实。事实的背后,总是会有真理,接下来就向大家揭晓真理:在多线程环境中,程序中的每个线程是以各自的进度“同时”在执行的,线程1在做事情A的时候,线程2可能在做事情B,如果事情A和事情B存在某种关联,则线程1与线程2就会构成竞争,如果这种竞争构成冲突,则会引发不可预测的结果。此外,各个线程“同时运行”的特性,是从宏观上来度量的,在微观角度上考查,则某一时刻,线程1与线程2未必真的同时在运行。现代的CPU,某个时刻,只能运行一个线程的代码,当线程数大于CPU数量的时候(几乎总是如此),CPU

7、通过分时来为不同的线程服务,因此某个时刻,总是有一些线程(不会超过电脑中CPU核心个数)在运行,而另外一些线程没有在运行,而在下一刻,之前正在运行的线程停止执行,没有运行的线程获得CPU,投入运行。这个过程被称之为线程调度或者说线程切换。运行的线程被调度为不运行,我们称之为切出,没运行的线程被运行,我们称之为切入。线程的切入切出,遵循一定的时间间隔,这个时间间隔比较短,通常在毫秒这个量级,同时由于各种原因,这种时间间隔又不是很精确,差几个微秒是非常正常的事情。但对于CPU而言,几微秒的差异就是数百万条的机器指令,因此两个线程

8、,就是做一样的事情,经过一断时间后,其各其的进度将会出现不小的差异(除非我们使用了某种方法来阻碍了这种差异的发生与扩大,如之前的示例程序中,我们让程序每执行一条程序就sleep1秒),从而导致程序运行结果的差异性。理论知识基本讲解完毕,我们接下来回到示例代码本身。我们将代码:gcnt++;

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

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

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