linux c多线程对全局变量的影响

一、在说明多线程对全局变量的影响之前,我们需要了解下面的一些基础知识:

        1、线程是CPU分配时间片的最小单位,通常一个CPU内核可以处理一个线程,如果是双核双线程,那么同一时刻可以处理两个线程。

        2、操作系统分配资源的最小单位是进程,线程是进程的一个实体,是CPU调度分派的基本单位(比如时间片)。

        3、线程不能独立运行,必须依靠在某个进程下,一个进程可以包含一个或多个线程,同一个进程中的多个线程可并发执行(是否真正并发执行,需要看CPU核数和线程数)。

        4、全局变量是在所有函数外部定义的函数,他的作用域默认是整个程序,也就是所有的源文件, .c 和.h。

二、假设现在有线程thread1,thread2两个线程,还有全局变量Num=0(Num++),寄存器add:

       1、线程对全局变量的访问会分为三步:

                    1)、取全局变量Num到寄存器add。

                    2)、对寄存器中的Num进行运算,既对Num的值进行运算。

                    3)、对寄存器运算完的值再存入Num中。

三、多线程在执行的时候已经由操作系统分配了一定的CPU时间片,去规定此线程的运行时间是多久(中间可能由于优先级以及中断被阻碍)。

四、当线thread1程执行到“第二步,对寄存器中的Nun进行运算”的时候,CPU分配的时间就已经到了,这样线程thread1就处于阻塞状态,此时Num的值依然是0,这样操作系统把执行权力交给了thread2执行,这样线程thread2执行完以后,Num变为1,然后CPU分配给thread2的时间到了,thread2被阻塞,操作系统把cpu控制权交给线程thread1,thread1从上次被阻塞的地方继续执行,这样输出的Num还是1,所以就造成了多线程操作同一个全局变量得到的结果是不可控的,也有可能输出的结果是0,1,2。

小结:如果多线程里面有处理(写操作)全局共享变量(整型,链表等),一定要给线程加锁,加了锁,操作系统就会在执行代码的时候保证在操作同一变量时只有一个线程在进行,这样就保证了结果的正确性。如果多个线程只对全局变量读,而不去写这个全局变量,则也不用进行加锁处理。

下一章节具体分析linux 下c的多线程代码(同步互斥,线程分离,休眠等)。

转载请注明原创出处,本博客只是博主自己总结的一点知识,若在博客中分析的知识点不对,或者不完善,请各位博友指正更正,谢谢!

 

补充:线程上下文切换

1、对于单核CPU来说,在同一时刻只能运行执行一个线程,当操作系统把正在运行的线程1的cpu的控制权交给另外一个线程2去执行的时候,这个过程叫做线程上下文切换(进程也有上下文切换)。

2、当在做上下文切换的时候,操作系统会把线程1中寄存器运算的值,以及指令执行到哪条的状态等进行保存下来,这样等下次恢复线程1运行状态时,会根据之前保存的这些状态值重新计算,所以线程上下文切换过程中会记录程序计数器、CPU寄存器状态等数据。

3、对于线程的上下文切换实际就是:存储和恢复CPU状态的过程,就像在VMware中打一个快照一样,保存这一时刻虚拟机中的所有值,等到还原虚拟机的时候,虚拟机中的环境是打快照之前的环境。

 

 

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