skąd mutex wie jaką zmienną ma chronić?

1

joł,
tak jak w tytule: dziwi mnie skąd mutex wie, że ma chronić zmienną, którą jest po prostu linijkę nad nim, np:

some_value value;
std::mutex  some_value_mutex;

//...później jakiś lock typu:
//std::lock_guard<std::mutex> lk(some_value_mutex);

jak some_value_mutex wie, że ma "ochraniać" value? magiczne sztuczki kompilatora?

7

Nie wie!
To logika twojego programu ma wiedzieć.
Generalnie mutex wymusza, synchronizację cache dla różnych core i potrafi przytrzymać watek jeśli inny lock trzyma mutex.

5

Mutex nie wie, programista wie. Jak programista go nie użyje to nie będzie żadnej ochrony.

0

okej, a on chroni zmienną, która jest przed nim, po nim czy jak to działa?

dopowiem: spodziewałem się, że mutex będzie brał arguement i będzie chronić ten argument, a tu się okazało, że nie trzeba dawać argumentu, tylko dopisać po prostu ten mutex pod zmienną i tyle. Bardziej po prostu interesuje mnie jak to kompilator widzi.

7

To działa tak, że działania wewnątrz locka są synchronizowane. Miejsce deklaracji/definicji mutexa nie ma żadnego znaczenia, jest blisko dla czytelności.

Pytasz skąd nóż wie że jest do krojenia i czy to dlatego jest z prawej strony, że z reguły schabowy jest z prawej na talerzu. To ma tyle samo związku co powiązanie mutexa i jakiejś innej zmiennej. A ż​e nóż jest do krojenia wie użytkownik (i to on musi go użyć).

3

Główny problemem wielowątkowości jest synchronizacja cache niskiego poziomu przyporządkowana do kontentego core CPU.
Poza pilnowaniem, że tylko jeden wątek może wejść w sekcję krytyczną, mutex wymusza synchronizację cache pomiędzy CPU (memory barrier).

Radzę jednak opanować zwykłe programowanie, zanim weźmiesz się za wielowątkowość. To wydaje się proste, bo łatwo napisać program, który tylko wydaje się działać poprawnie (na twojej maszynie będzie zawsze działać, a u jednaj osoby na 1000 będzie zawsze się crash-ować).
Ten temat jest najbardziej lekko traktowany mimo swojego ciężaru, więc internet jest pełen bzdur na ten temat, więc uważaj.

0

haha, no dobra trochę w sumie dziwne pytanie pewnie zadałem, ale nie mogłem sobie tego w głowie poukładać :P trochę ciężko zobrazować sobie co tam się pod spodem może dziać, przynajmniej na razie dla mnie. Jakieś animacje by się przydały jak to jest z niektórymi algorytmami/strukturami na yt :P

5

Mutex nie ochrania żadnej zmiennej. Mutex sprawia jedynie że do danego bloku kodu wejdzie nie więcej niż 1 wątek na raz. Wyobraź sobie prosty przykład:

x = x+1;

Co się stanie jeśli ten kod na raz będzie wykonywać wiele wątków? Powiedzmy że puscisz 100 wątków na tej instrukcji. Załóżmy że początkowo x=0, ile będzie wynosiło na koniec? Liczenie na to, ze będzie wynosiło 100 jest bardzo naiwne, bo co jeśli wszystkie wątki zdążyły odczytać wartość x jako 0 i wykonają x = 0+1? :) Mutex sprawia ze dany kawałek kodu wykonuje tylko jeden wątek na raz i takiego problemu już nie ma.

0
Cyberah napisał(a):

okej, a on chroni zmienną, która jest przed nim, po nim czy jak to działa?

Wyobraź sobie kod "chroniony" przez mutex jako fragment torów, zaś mutex jako semafor przed wjazdem, tylko jeden pociąg może tam wjechać.

0

dobra, czaję już mniej więcej o co chodzi. Dzięki za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1