Załóżmy, że mam wektor z 4 elementami. W aplikacji mam 4 wątki, każdy z tych wątków zajmuje się aktualizowaniem tylko jednego elementu tego wektora. Ponadto jest jeszcze jeden wątek, który pobiera dane z elementów wektora i wysyła je na serwer.
No i tutaj pojawia się pytanie - czy coś takiego jest bezpieczne, czy trzeba dodać jakieś zabezpieczenia zapisu/odczytu z wektora? #cpp #programowanie
@Crypton3: W przypadku integera zmiana może być nieatomowa, co znaczy, że wątek czytający dostanie część liczby przed zmianą przez inny wątek a część po zmianie. (Zależy od wielkości słowa procesora i liczby bitów liczby)
@Crypton3: Z możliwych problemów, to może byc taki, że odczytasz w trakcie zmiany elementów i dostaniesz część danych z poprzednimi wartościami, część z nowymi
@Crypton3: z wątków modyfikujących wektor wysyłaj powiadomienie do wątku pobierającego dane, wtedy nie dojdzie do sytuacji takiej jak napisał @Kaczus2B
@Kaczus2B: albo inny problem, to taki, że różne fizyczne procesory, będą miały wartość w cache i nie nastąpi jego synchronizacja bez memory barrier / fence.
No i tutaj pojawia się pytanie - czy coś takiego jest bezpieczne, czy trzeba dodać jakieś zabezpieczenia zapisu/odczytu z wektora?
#cpp #programowanie
Komentarz usunięty przez autora
std::atomic.@Crypton3: Z tego opisu wynika, że nie, bo jeden wątek może zapisywać element w trakcie gdy wątek wysyłający będzie chciał go odczytać.
Komentarz usunięty przez autora