unsigned counter 0 void do stuff void arg for int i 0 i 200000000 i counter return arg unsigned counter 0 void do stuff void arg for int i 0 i 200000000 i counter return arg 1 2 3 6 5 77 1 4 8 counter 0 1 7 4 counter 4 9 counter counter lw t0 counter addi t0 t0 1 sw t0 counter lw t0 counter addi t0 t0 1 sw t0 counter lw t0 counter lw t0 counter addi t0 t0 1 lw t0 counter addi t0 t0 1 sw t0 counter counter addi t0 t0 1 sw t0 counter sw counter 77 t0 counter counter 2 1 1 2 A B 2C E 2 D A 7B 1 2 2C 2 6 F C 0 123 unsigned lock 0 spin lw bne li sw while 1 If lock 0 lock 1 break t0 t0 t1 t1 0 a0 0 spin 1 0 a0 7 G spin lw bne li sw t0 t0 t1 t1 0 a0 0 spin 1 0 a0 4 5 temp addr if temp old addr new else old temp x86 calls it CMPXCHG compare exchange Use the lock prefix to guarantee it s atomicity 6 7 3 lock acquire li t0 0 old li t1 1 new cas t0 t1 lock beq t0 t1 lock acquire sw t0 lock failed try again 1 1 4 H 2 2 I 2 A F 2 B
View Full Document