Re[2]: внутренняя реализация std::mutex?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 17.05.18 09:55
Оценка:
Здравствуйте, 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 или близкий, лучше так.
The God is real, unless declared integer.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.