linux c多线程编程之全局变量访问操作

参考文章1:https://blog.csdn.net/chz_1/article/details/87927041

假设现在有线程A和线程B,还有全局变量i,寄存器X
1、线程对全局变量的访问时分三步走的 :
(1)取全局变量i到某个寄存器X
(2)对寄存器进行操作,即操作i的值
(3)操作完之后将寄存器X的值存到i

2、多线程实际上是由时间片选来轮换进行的。当线程A执行到某个地方还没结束的时候,可能就会轮换到线程B来执行。

3、总和上述两点,当线程A访问变量i的时候,可能只到了第(2)小步,就轮换到线程B了。
举个例子:
线程A :

int i = 1;

i++

线程B:

--i
执行过程顺序如下:


最终的结果可能是0或者1或者2。

小结:如果多线程里面的共享变量(整型变量、链表等等)是需要都进行运算且被重新赋值的,一定要加线程锁,保证执行顺序。加了锁,保证一个线程的该部分访问完再访问其他线程的,这就叫原子性。需要靠加锁来保证原子性操作。那么,如果变量的运算只在一个线程里面,其他线程只是取这些值做判断而且是循环性质的判断,那可以不用加。

你可能感兴趣的:(linux,c,全局变量,多线程访问)