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. –
- 1. Jakie są przykłady interfejsów Go?
- 2. Jakie są przykłady użycia Nokogiri?
- 3. Jakie są rzeczywiste przykłady wykresu zależności Gradle'a?
- 4. Jakie są imponujące przykłady kodu funkcjonalnego?
- 5. Jakie są klasy pamięci w D?
- 6. Jakie są dobre przykłady bibliotek klientów REST API w JavaScript
- 7. Używanie barier pamięci do wymuszania wykonywania w kolejności
- 8. Jakie są przykłady implementacji wzorców projektowych przy użyciu JavaScript?
- 9. Co to jest OSGi i jakie są przykłady jego użycia?
- 10. Jakie są przykłady aktualnie opracowywanych aplikacji/bibliotek tłumaczenia maszynowego?
- 11. Jakie są "wytyczne" C++ GSL?
- 12. W systemie Linux, jakie pliki są mapowane w pamięci?
- 13. Jakie są typy zwracanych operatorów w C++?
- 14. Jakie są konwencje nazewnictwa w języku C#?
- 15. Jakie są podobieństwa między modelem pamięci Java a modelem pamięci C++ 11?
- 16. Jakie są zalety NSBinaryStoreType?
- 17. Czy zapisuje dokładność w pamięci dziesiętnej z parsowanego ciągu w C#? Jakie są konsekwencje?
- 18. Niestandardowy alokator pamięci/menedżer w C? jakie podejście?
- 19. x509 C# przykłady?
- 20. C# przykłady logowania
- 21. Przykład C++ "bariera pamięci"
- 22. Jakie są najlepsze niedrogie biblioteki audio C++?
- 23. Jakie są wszystkie sposoby przydzielania pamięci w C i czym się różnią?
- 24. Jak określić, jakie obiekty są zbierane przez moduł czyszczenia pamięci?
- 25. Jakie są różnice w inicjalizacji łańcuchów w C++?
- 26. Jakie są trywialne operacje w std :: is_trivially_copy_constructible w C++
- 27. Jakie są zalety korzystania z Objective-C przez C++?
- 28. Jakie są niezgodne różnice między C (99) i C++ (11)?
- 29. Jakie przykładowe przykłady sĘ ... tam pokazywane rzuty w stylu C sĘ ... złe?
- 30. Jakie są alternatywy dla biblioteki wielościennej dla C/C++?
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. –