Widzę, że blokada muteksów C++ 11 nie jest void lock() volatile
. W jaki sposób kompilator wie, które funkcje są barierami pamięci, a które nie? Czy wszystkie funkcje są barierami, nawet jeśli nie są niestabilne? Jakie są mniej znane bariery pamięci i bariery pamięci, które każdy powinien znać?Jakie są przykłady barier pamięci w C++?
Odpowiedz
Biblioteka środowiska wykonawczego musi zaimplementować muteks w taki sposób, aby kompilator wiedział! Standard językowy nie mówi nic o tym, jak to zrobić.
Prawdopodobnie wiąże się to z wywołaniem usługi systemu operacyjnego działającej jako bariera pamięci. Lub kompilator może mieć rozszerzenie, takie jak void _ReadWriteBarrier();
Rzeczywista implementacja twojego std::mutex
będzie taka, że kompilator nie wykona niedozwolonej zmiany kolejności, nie usunie zmiennych obciążeń i zapewni dostęp do zmiennej blokującej atomowo i że CPU wykonuje niezbędne bariery pamięci dla pozyskiwania i uwalniania blokady.
Szczegółowe informacje na temat tego, ile pracy należy wykonać, aby było to zróżnicowane w zależności od platformy, ale implementacja biblioteki pozwoli na właściwe wykonanie.
Moje pytanie dotyczy raczej tego, jak kompilator wie, co jest w muteksie i dlaczego nie zmienia kolejności zmiennych przed i po zablokowaniu? Funkcje z pewnością nie są oznaczone jako zmienne. Również kiedyś spojrzał na nagłówki MSVC i wydaje się, że nie jest szablon i jest połączony za pośrednictwem biblioteki. Więc ... nie wierzę w to, aby kompilator mógł przeanalizować i zobaczyć, czy to wymaga vars w * tej * funkcji, której nie można zmienić ... –
@ acidzombie24: Przypuszczalnie zewnętrzne wywołanie funkcji nigdy nie zostanie zmienione przez kompilator, ponieważ, jak zaobserwujesz, nigdy nie udowodniono, że jest to poprawne. –
To naprawdę zależy od platformy. Kompilatory C++ dla systemów wbudowanych z tylko jednym rdzeniem mogą być w stanie implementować muteksy bez jakiejkolwiek bariery pamięci, ponieważ pamięć jest zawsze spójna. –
@BenVoigt, nadal muszą blokować porządkowanie instrukcji kompilatora. –