#programowanie #cpp czy muszę używać mutexów jeżeli w jednym wątku tylko zapisuję, a w drugim tylko odczytuję? w przypadku kolejki wiadomo, że muszę, ale jeżeli mam np. zmienną int "status" i tylko ją sobie printuję w głownym wątku, a w wątku dodatkowym zmieniam?
@s_theCapt: jak zawiniesz ją w std::atomic to powinno być ok. No chyba, że ten zapis nie jest w ogóle atomowy (np. rozbity na kilka kroków), wtedy musisz dać mutex.
@s_theCapt: Jeśli nie chcesz użyć mutexa i instrukcji atomic, to daj status jako volatile int i w wątku odczytującym, przed odczytem - read barrier, a w wątku zapisującym, po zapisie - write barrier
@afe1: atomic wydaje się bardzo automatyczne, po prostu wpisałem atomic w kodzie, nic nie zmieniałem i dziala... czy robię coś źle, czy dajesz alternatywę po prostu?
@s_theCapt: mutexy (i w zasadzie wszystkie inne prymitywy do synchronizacji) zapewniają memory barrier: w skrócie to chodzi o to, że wątek modyfikujący musi powiedzieć w jakiś sposób innym wątkom (np. przy pomocy MESI), że coś się stało. Zasada jest taka, że jak masz wiele wątków i chcesz współdzielić jakieś zasoby to musisz używać mechanizmów synchronizacji np. mutexów albo atomiców. Oczywiście jest wiele sposobów np. tworzysz wątek w mainie i
@Saly: no niestety tu mam wątek który chodzi równolegle i robi więcej niż ten główny, ale od czasu do czasu muszę coś sczytać (i użyłem teraz tych atomiców do tego), albo wysłać polecenie (do tego używam muteksa na kolejce z poleceniami)
czy muszę używać mutexów jeżeli w jednym wątku tylko zapisuję, a w drugim tylko odczytuję? w przypadku kolejki wiadomo, że muszę, ale jeżeli mam np. zmienną int "status" i tylko ją sobie printuję w głownym wątku, a w wątku dodatkowym zmieniam?
std::atomicto powinno być ok. No chyba, że ten zapis nie jest w ogóle atomowy (np. rozbity na kilka kroków), wtedy musisz dać mutex.https://stackoverflow.com/questions/54188/are-c-reads-and-writes-of-an-int-atomic#:~:text=To%20increment%20an%20int%2C%20the,This%20is%20not%20atomic.&text=Operations%20on%20%22ordinary%22%20variables%20are%20not%20guaranteed%20to%20be%20atomic.
volatile inti w wątku odczytującym, przed odczytem - read barrier, a w wątku zapisującym, po zapisie - write barrier