Zdravim,
mám následující problém.
V 6. různých vláknech , které obsahují společnou instanci objektu, si spouštím funkci, která provádí cyklus a vypisuje hodnotu toho společného objektu.
Výstup zde:
Je omlouvám se, ono se mi to sem vložilo všechno nějak špatně :)
Zkusím to popsat znovu, to první ignorujte, tam mi nějak zablbnul editor.
Takže, mám jednu instanci objektu. Tento objekt obsahuje jednu proměnnou, kterou umí ten objekt inkrementoat pomocí metody increment().
Když to inkrementování tohoto jednoho objektu spustím na několika vláknech, tak ta inkrementace probíhá zcela v pořádku. Chci tím říci, že si ty vlákna vůbec nelezou do zelí a to nepoužívám žádné mutexy a podobně.
Někde jsem četl, že když se nepoužívá uzamčení, měli by si vlákna lézt do zelí a inkrementovaná hodnota by mohla vrátit jiné číslo, než bych očekával, protože třeba 3 vlákna z těch šesti si zároveň inkrementují svoji nahranou hodnotu a pak ji zároveň zapíší zpět do objektu což by způsobilo to, že se vlastně inkrementuje jen jednou.
Mě se tohle prostě nestává a to mi přijde divné. Proto bych rád znal názor odborníků.
Nejsem si jist, jestli zcela přesně chápu, chtělo by to ukázku kódu. Ale pokud ve funkci skutečně jenom inkrementuješ, tak zde žádná velká kolize nehrozí - inkrementace je atomická operace...
no na to se musi pouzivat atomicke operace... takovy: promenna++; to se nejprve nahraje do registru, pricte se k tomu, ulozi do pameti a vrati se puvodni hodnota... to ze ti to funguje, je jen nahoda (nebo delas operace atomicky) - nahoda v tom, ze zatim jeste nedoslo k preruseni nekde uprostred... ale to jednou za cas proste probehne a pak se teprve dejou veci
Aha, díky já s tímhle začínám, to si ještě musím nastudovate co znamená atomická operace, díky.
Děkuji vám
Ještě mě napadla jedna věc :)
Když mám třeba 2 vláknový procesor a přesto obě vlákna provedou atomickou operaci sučasně (třeba přiřadí obyčejné číslo do společné int proměnné, což by měla být atomická operace). Může zde nastat kolize?
Jde mi o to, zda jsou tyto atomické instrukce chráněny před tím, aby dvě vlákna(skutečná 2 fyzická) nemohla současně provést jednu instrukci nad společnou proměnnou.
NA jednoprocesorovém systému to chráněno je, tam to jedno vlákno nemůže být přerušeno, i kdyby mu skončil čas přidělený procesorem. Ale u fyzicky 2 procesorovém systému je tato atomicita nějak zajištěna?
nad tim sem uz taky parkrat premyslel, ale tam by to melo byt osetrene na urovni sbernic... nemuzes mit dva procesory na sbernici soucasne... dokonce ani na ruzny adresy v ramci jedne sbernice...
Já jsem také někde četl, že by to mělo být ošetřeno na úrovni hardwareu. Ale nebyl jsem si jistý, zda to platí i pro tuto situaci. Díky
Ono záleží na architektuře procesoru použitém OS, počtu spuštěných aplikací které využívají procesor atp.
Ale obecně není zaručeno že pokud se operace provede jednou instrukcí tak je to na na více jádrovém(nebo více procesorovém) procesoru atomická operace. Na atomické operace jsou extra instrukce(např LOCK CMPXCHG). A existuje několik vrstev mezipamětí(Cache) na procesoru které mohou a nemusí mít vliv. Pro googlování doporučuji zajímavý termín "memory barier"/"memory fences".
Určitě je to všechno moc zajímavé a poučné k nastudování, nicméně pro reálné použití v programu je přímé použití nebezpečné a já už se raději držím zaběhnutých připravených primitiv (mutext, kritická sekce, semafor,...). I s těmi se dá užít spousty zábavy u hledání problémů typu deadlock,livelock atp. které se projevují třeba jen jednou za měsíc nebo jen na konkrétním stroji.
Zamykat zAmykat zaMykat. Ostatně pro většinu vícevláknových aplikací jsou Kritické sekce, (a nepojmenované mutexy) dostatečně efektivní, případně se dají použít v kombinacích s semafory a eventy.
V opačném případě je třeba skusit spíše (tak tomu říkám já) "tzv. paralelní programování" s pomocí OpenMP,OpenCL.
(tj, já říkám vícevláknové pokud jde o vlákna která víceméně pracují samostatně déle než 0.4..10sec, a paralelní pokud se snažím paralelizovat i vlemi krátké úseky kódu (např cykly atp))
#12 Ovrscout
akorat sou mutexy priserne pomaly... kde to aspon trochu jde, tam se pouzivaji bezzamkove techniky... samozrejme nekde to neni vhodny, tak se pouzijou zamky
ale samozrejme to neni nutne pokud to nemusi zvladat maximum co muze..
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku