EVALUATION
I should have know that volatile in C++ is different from Java volatile. It does not guaranty atomicity:
80 inline jlong OrderAccess::load_acquire(volatile jlong* p) { return *p; }
0xfe7e2458: load_acquire : save %sp, -104, %sp
0xfe7e245c: load_acquire+0x0004: st %i0, [%fp + 68]
0xfe7e2460: load_acquire+0x0008: ld [%fp + 68], %l0
0xfe7e2464: load_acquire+0x000c: ld [%l0 + 4], %l1
0xfe7e2468: load_acquire+0x0010: ld [%l0], %l0
0xfe7e246c: load_acquire+0x0014: st %l0, [%fp - 8]
0xfe7e2470: load_acquire+0x0018: st %l1, [%fp - 4]
0xfe7e2474: load_acquire+0x001c: ldx [%fp - 8], %g1
0xfe7e2478: load_acquire+0x0020: srlx %g1, 32, %l0
0xfe7e247c: load_acquire+0x0024: mov %g1, %l1
0xfe7e2480: load_acquire+0x0028: mov %l1, %i1
0xfe7e2484: load_acquire+0x002c: mov %l0, %i0
0xfe7e2488: load_acquire+0x0030: ret
0xfe7e248c: load_acquire+0x0034: restore
|