假设现在有线程A和线程B,还有全局变量i,寄存器X
1、线程对全局变量的访问时分三步走的 :
(1)、取全局变量i到某个寄存器X
(2)、对寄存器进行操作,即操作i的值
(3)、操作完之后将寄存器X的值存会i
2、多线程实际上是由时间片选来轮换进行的。当线程A执行到某个地方还没结束的时候,可能就会轮换到线程B来执行。
3、总和上述两点,当线程A访问变量i的时候,可能只到了第(2)小步,就轮换到线程B了。
举个例子:
线程A 线程B
i = 1 --i
++ i
执行过程顺序如下:

最终的结果可能是0或者1或者2。
小结:如果多线程里面的共享变量(整型变量、链表等等)是需要都进行运算,增减的,一定要加线程锁,保证执行顺序。加了锁,保证一个线程的该部分访问完再访问其他线程的,这就叫原子性。需要靠加锁来保证原子性操作。
那么,如果变量的运算、增减只在一个线程里面,其他线程只是取这些值做判断而且是循环性质的判断,那可以不用加。否则,哪怕只是做判断但没有循环地去判断,一定得加锁。
本文探讨了多线程环境下全局变量访问的问题,强调了线程锁的重要性,以确保操作的原子性和数据的一致性。当多个线程对共享变量进行读写操作时,必须采取措施防止竞态条件。
883

被折叠的 条评论
为什么被折叠?



