Niedawno dowiedziałem się, że kompilatory zoptymalizują kod poprzez zmianę kolejności instrukcji i że można to kontrolować za pomocą barier.Czy potrzebuję ogrodzenia lub bariery lub czegoś, gdy blokady/blokady mutex są zakopane głęboko w wywołaniach funkcji?
IIRC, blokowania mutex sprawia barierę i odblokowywanie mutex również sprawia, barierę, aby zachować kod wewnątrz sekcji krytycznej przed dostaniem się.
Więc pthread_mutex_lock i pthread_mutex_unlock niejawnie musi być te „przeszkody”. Co jeśli mam taką klasę, która otula mój muteks?
class IMutex {
public:
virtual void lock() = 0;
virtual void unlock() = 0;
};
wydaje mi się, że kompilator nie będzie wiedział, że dzwonię pthread_mutex_lock() wewnątrz zamka() i pthread_mutex_unlock() wewnątrz unlock(), bo to wszystko virtual'd dalej.
doprowadzi to do błędów? Czy muszę jakoś ręcznie określać bariery?
Myślę, że wywołanie funkcji byłoby przeszkodą w ruchu kodu kompilatora. Używamy muteksów i nie dodajemy żadnych barier. Istnieją bariery pamięci, które są czymś zupełnie innym. –
oh, to ma sens. dzięki! – Verdagon
Tak, żaden porządny kompilator nie zmieni kolejki wokół wirtualnego wywołania funkcji ... –