Здравствуйте, barney, Вы писали:
B>вот, сделал, учебную реализацию спин-блокировки через test-and-set для x64
1. Что за компилятор?
2. Явная ошибка:
B> __asm {
B> outer:
B> mov rbx,flag
B> mov eax,[rbx]
B> cmp eax,0
B> jne outer
B> xor ecx,ecx
B> xor eax, eax
B> mov rbx,flag
B> loop:
B> inc ecx
B> lock bts [rbx], eax // lock + bts atomic test-and-set
B> jnc loop
CF=0 как раз если было 0, то есть спинлок захвачен. Нафига в этом случае возвращаться на loop? Ты делаешь всё наоборот — если захватил, идёшь на круг
Тут лучше ложится jc outer (и вообще, outer и loop совместить)
B> mov spins_count,ecx
B> }
B> // locked
B> std::cout << "\nINSIDE_THE_LOCK:" << spins_count << "\n";
B> __asm {
B> mov rbx,flag
B> xor eax,eax
B> mov [rbx],eax
Вот уж где ассемблер нафиг не нужен, достаточно простого присвоения... хотя, если компилятор системы MSVC или близкий, лучше так.