Re: внутренняя реализация std::mutex?
От: barney  
Дата: 17.05.18 09:47
Оценка:
вот, сделал, учебную реализацию спин-блокировки через test-and-set для x64
На мак оси работает с ошибками,
в общем виде вывод смешан (как и должно быть, тк main thread не блочится)
но даже между обоими spinner почему то такая блокировка не работает:
"INSIDE THE LOCK" выводится не всегда неразрывно со spin_count
хотя здесь должна быть жесткая гарантия

#include <iostream>
#include <thread>

int mutex = 0;

inline void Lock(int * flag) {
    
    int spins_count = 0;
    
    __asm {
    outer:
        mov rbx,flag
        mov eax,[rbx]
        cmp eax,0
        jne outer
        
        xor ecx,ecx
        xor eax, eax
        mov rbx,flag
    loop:
        inc ecx
        lock bts [rbx], eax   // lock + bts atomic test-and-set
        jnc loop
        mov spins_count,ecx
    }
    // locked
    std::cout << "\nINSIDE_THE_LOCK:" << spins_count << "\n";
    __asm {
        mov rbx,flag
        xor eax,eax
        mov [rbx],eax
    }
}

void spinner(char * id) {
    
    while (true) {
        Lock(&mutex);
        // not locked
        std::cout << "·" << "SPINNER:" << id << "·";
    }
}

int main() {
    char * Q = "Q";
    char * W = "W";
    
    std::thread t1(spinner, Q);
    std::thread t2(spinner, W);
    
    while (true) {
        // not locked
        std::cout << "•";
    }
}


Вывод вот такой:
  вывод
•
INSIDE_THE_LOCK:••2•
•
INSIDE_THE_LOCK:·•2SPINNER:•
Q•··•SPINNER:
INSIDE_THE_LOCK:•W2•·
•
INSIDE_THE_LOCK:·•2SPINNER:•
Q•··•SPINNER:
INSIDE_THE_LOCK:•W2•·
•·
INSIDE_THE_LOCK:•SPINNER:2•
Q•··•SPINNER:
INSIDE_THE_LOCK:•W2•·
•·
INSIDE_THE_LOCK:•SPINNER:2•Q
•··•
INSIDE_THE_LOCK:SPINNER:•2W•
·•·
INSIDE_THE_LOCK:•SPINNER:2•Q
•··•
INSIDE_THE_LOCK:SPINNER:•2W•


Вот "INSIDE_THE_LOCK:SPINNER:•2W•"
здесь должно быть "INSIDE_THE_LOCK:2" или "INSIDE_THE_LOCK: ••2" но SPINNER должен был вывестись ПОСЛЕ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.