Aktywne Wpisy

Rv0000 +33

Minieri +33
No dzisiaj dałem się zrobić, aż mi wstyd. Gościu wszedł na stację, chwycił Oshee różowe z lodówki i Halne Megamocne 10% z półki na dole, podchodzi do kasy i mówi od razu że płaci kartą ale coś mu NFC dzisiaj nawala, próbuje i nic, mówię że może blikiem w takim razie a on że nie, nie i mówi to dziękuję, odłożę. Podchodzi do lodówki, odkłada Oshee tak żebym widział i schyla się





Do tej pory zawsze kompilowałem programy wielowątkowe bez żadnej optymalizacji i wszystko śmigało. Dołożenie flagi -02 może zepsuć działający kod przez optymalizacje kodu, najprostszy przykład:
int a=0 ; // zmienna globalna z której wszyscy będą korzystać... ; while(!a) {} ; ... // watek1... ; a=1 ; ... // watek 2I teraz aktywne oczekiwanie z wątku nr 1 może zostać zwinięte przez kompilator do wyrażenia postaci:
if(!a) for(;;) {}bo kompilator z punktu widzenia jednowątkowej kompilacji nie ma pojęcia, że zmienna może się zmienić pomiędzy odczytami. Rozwiązanie tego problemu to dołożenie volatile do definicji zmiennej a.
Po tym przydługim wstępie zarysującym problem pora na moje rozkminy. Załóżmy że mamy jakąś sekcję krytyczną, dostęp do zmiennych, które za każdym razem obstawiamy mutexami z . Czy wszystkie zmienne też muszą być zdefiniowane jako volatile ? W sensie czy istnieje jakis kod w stylu:
m.lock() ;... // sekcja krytyczna, dostep do zmiennych
m.unlock() ;
w którym jeśli użyte zmienne nie będą volatile, to kompilator z flagą O2 może sobie zrobić takie optymalizacje, które zepsują wielowątkowy program?
#kiciochpyta
2) Pozbądź się zmiennych globalnych, pozbędziesz się problemu z optymalizacjami....
https://stackoverflow.com/a/12878500
docelowa aplikacje i tak będzie mała, to nie jest jakiś złożony projekt
@dasdadas4: Potestuje troche pozniej i Ci dam znać, generalnie troche dziwne aby kompilator robil taka optymalizacje
Nie może. Twój program się zepsuł, bo miał
@ponton: cóż, to miał być przykład gdy kompilator może coś zepsuć, a nie mój faktyczny program. W moim faktycznym programie to odczyt/zapis do współdzielonych zmiennych mutexami obłożę mutexami - i pytam czy wtedy kompilator nadal może zrobić jakąś optymalizacyjną sztuczkę, która coś zepsuje
http://en.cppreference.com/w/cpp/atomic/memory_order
http://en.cppreference.com/w/cpp/concept/Mutex
poprzez zmienną
std::atomicA co do synchronizacji to prócz mutexu do takich żeczy używa się conditonal_varible, albo poprostu semaforów.
m.lock()a
std::memory_model