Spinlock e Hyper-Thread
Algo curioso que estive vendo hoje..
Encontrei um disassembly do SQL Server rodando na minha máquina com o código do Spinlock (em vermelho):
sqlservr!Spinlock<60,7,0>::SpinToAcquireOptimistic+0x3d: 00000000`01aca459 33c9 xor ecx,ecx 00000000`01aca45b 85db test ebx,ebx 00000000`01aca45d 7412 je 00000000`01aca471 00000000`01aca45f 8b07 mov eax,dword ptr [rdi] 00000000`01aca461 85c0 test eax,eax 00000000`01aca463 7407 je 00000000`01aca46c 00000000`01aca465 90 nop 00000000`01aca466 03cd add ecx,ebp 00000000`01aca468 3bcb cmp ecx,ebx 00000000`01aca46a 72f3 jb 00000000`01aca45f 00000000`01aca46c 4c8b442438 mov r8,qword ptr [rsp+38h]
Um comentário curioso: a instrução NOP no endereço 01aca465 não realiza nada, mas permite que processadores com Hyper-Threading façam a mudança de contexto para o próximo processador lógico. Esse comportamento torna a função “Hyper-Threading Friendly” e economiza energia!