Oto kod C++, do którego można uzyskać dostęp z wielu wątków równolegle. Ma sekcję krytyczną:Zmiana kolejności instrukcji za pomocą blokad
lock.Acquire();
current_id = shared_id;
// small amounts of other code
shared_id = (shared_id + 1) % max_id;
lock.Release();
// do something with current_id
Klasa zmiennej blokującej jest opakowaniem wokół implementacji mutex POSIX. Ze względu na operacje modułu nie można korzystać z operacji atomowych.
Czy możliwe jest, że kompilator gcc z flagą O3 optymalizuje kod tak, aby przypisanie current_id zostało przeniesione przed blokadą?
Masz na myśli "chyba że funkcja jest oznaczona jako czysta ** lub kompilator jest w stanie ustalić, że jest to bezpieczne **. , wynik końcowy jest taki sam, kompilator generalnie nie dokona optymalizacji, chyba że będzie w stanie zweryfikować, czy jest ona bezpieczna. – jalf
Jeśli "current_id" i "shared_id" są zmiennymi lokalnymi, które nie zostały zmienione z bieżącego zakresu (adres nie zostało to dane komukolwiek innemu itd.), wtedy optymalizator mógłby zmienić kolejność tych linii, ignorując możliwą mutację z zewnętrznych wywołań funkcji. Zakładam, że tak nie jest w tym przypadku, – ephemient
@ephemient: ale jeśli są one lokalne i nie ma ich wcale. jeden na zewnątrz wie, w jaki sposób zewnętrzne wywołanie funkcji może je zmodyfikować? – Kosi2801