От: | barney | ||
Дата: | 17.05.18 09:47 | ||
Оценка: |
#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:SPINNER:•2W•" здесь должно быть "INSIDE_THE_LOCK:2" или "INSIDE_THE_LOCK: ••2" но SPINNER должен был вывестись ПОСЛЕ | |