原子操作:要么不做,要么一次性做完
非原子操作
其实ABCD都是对的。
B选项:正常执行,I线程执行2条语句全部执行完毕,再执行II线程重新执行一遍foo函数。
C选项:先执行I线程foo函数第一行代码,然后跳转执行II线程foo函数,返回后执行foo的后续代码
A选项:I线程中printf函数实际上并不是直接输出,而是把数据放入缓冲区中,因此有可能A线程将打印的2放入缓冲区中,还没来得及输出,这时候B线程打印了3,时间片轮转回来就会后打印2
D选项:a=a+1本身就不是原子操作因此有可能同时进行操作,都向寄存器中加载1进去,然后进行+1后,将2放回内存,因此有可能会打印2和2
如果是原子性的操作,就不会有A和D选项正确了!!!
因为,原子性操作的话,a=a+1与printf()必须全部执行完毕才可以被切换到其他进程或线程