嵌入式Linux开发 多线程的并发性————多线程存在延时函数和不存在延时函数运行结果不同的原因

多线程的并发性————多线程存在延时函数和不存在延时函数运行结果不同的原因

今天继续学习了linux应用程序开发有关线程的知识,主要学的是线程同步互斥,内容是互斥锁(mutex)和信号量(sem)。在学习的过程中发现了一个问题,让我产生疑惑,当我们在线程函数体中写延时函数和不写延时函数最终程序运行的结果是完全不同的,主要原因就是多线程的并发性,通过以下这个程序举例。
先在线程函数体中添加一秒钟的延时函数看一下运行效果
嵌入式Linux开发 多线程的并发性————多线程存在延时函数和不存在延时函数运行结果不同的原因_第1张图片
嵌入式Linux开发 多线程的并发性————多线程存在延时函数和不存在延时函数运行结果不同的原因_第2张图片
嵌入式Linux开发 多线程的并发性————多线程存在延时函数和不存在延时函数运行结果不同的原因_第3张图片
然后将延时函数屏蔽,屏蔽后在运行看结果
嵌入式Linux开发 多线程的并发性————多线程存在延时函数和不存在延时函数运行结果不同的原因_第4张图片嵌入式Linux开发 多线程的并发性————多线程存在延时函数和不存在延时函数运行结果不同的原因_第5张图片
嵌入式Linux开发 多线程的并发性————多线程存在延时函数和不存在延时函数运行结果不同的原因_第6张图片
分析: 只是因为一秒的延时函数,程序运行结果却相差很大,在程序中两个线程共用一块资源。当不存在延时函数的时候,cpu一般会先执行完一个线程再去执行另外的一个线程。但是当存在延时函数的时候,cpu就会有时间去执行其他的线程。话这样说没毛病,可是为什么cpu不乖乖的等着呢,主要原因还是多线程的并发性。并发性指的是在一个核上也就是只有一个cpu在进行数据处理工作,cpu会周期性的执行这些工作,这就好像你在跑400米,跑了一圈又一圈,周而复始的跑。通过下面这个图可能会更直观一些,我们日常生活中电脑会运行很多的软件,但是cpu不是同时运行他们的,而是在一个很短的周期内依次循环执行这些软件,cpu好像在围绕这个圈跑,跑到哪运行哪一个。理解了这个概念以后忽然明白了,为什么有无延时函数结果差异这大,无延时函数的时候,cpu之所以先执行完一个线程再去顺序执行另一个的原因是,执行一个线程所需要时间太短了,cpu只需要跑动一个周期的特别少的一部分就可以完成,所以就顺序执行下来了。然而存在延时函数,在延时函数的过程中,cpu又继续的向下跑了很远,具体是到了下一个线程还是跑过一个周期又回到我们当前这个线程就看缘分了,所以有延时函数时出现的效果不是顺序执行的效果,而且每运行完依次含延时函数的程序最终的结果都是不一样。但是也不是绝对的,如果我们某个线程的函数体特别大运行时间特别长,占用cpu时间多了,这时候即使没有延时函数的存在,cpu也可能去执行其他的线程,这个点是需要注意的。
嵌入式Linux开发 多线程的并发性————多线程存在延时函数和不存在延时函数运行结果不同的原因_第7张图片

你可能感兴趣的:(linux,linux)