2012-07-29 25 views
10

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++?

+5

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. –

+1

@BenVoigt, nadal muszą blokować porządkowanie instrukcji kompilatora. –

Odpowiedz

5

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();

5

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.

+1

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ć ... –

+0

@ acidzombie24: Przypuszczalnie zewnętrzne wywołanie funkcji nigdy nie zostanie zmienione przez kompilator, ponieważ, jak zaobserwujesz, nigdy nie udowodniono, że jest to poprawne. –