Vícevláknové – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Vícevláknové – C / C++ – Fórum – Programujte.comVícevláknové – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Martin Kozibrátka0
Stálý člen
8. 6. 2013   #1
-
0
-

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:

Nahlásit jako SPAM
IP: 88.83.169.–
Savana.cz - neomezený webhosting za pár kaček :)
Reklama
Reklama
KIIV+42
God of flame
8. 6. 2013   #2
-
0
-

a v cem je tedy problem? (+ kazdej normalni grafickej program umi orezat obrazek - dokonce i mspaint)

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Martin Kozibrátka0
Stálý člen
8. 6. 2013   #3
-
0
-

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ů.

Nahlásit jako SPAM
IP: 88.83.169.–
Savana.cz - neomezený webhosting za pár kaček :)
yaqwsx+9
Posthunter
8. 6. 2013   #4
-
0
-

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...

Nahlásit jako SPAM
IP: 85.160.38.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
KIIV+42
God of flame
8. 6. 2013   #5
-
0
-

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

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Martin Kozibrátka0
Stálý člen
8. 6. 2013   #6
-
0
-

Aha, díky já s tímhle začínám, to si ještě musím nastudovate co znamená atomická operace, díky.

Nahlásit jako SPAM
IP: 88.83.169.–
Savana.cz - neomezený webhosting za pár kaček :)
KIIV+42
God of flame
8. 6. 2013   #7
-
0
-

atomicka znamena ze je to pricteni provedeno jedinym krokem (obvykle jedna instrukce)

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Martin Kozibrátka0
Stálý člen
8. 6. 2013   #8
-
0
-

Děkuji vám

Nahlásit jako SPAM
IP: 88.83.169.–
Savana.cz - neomezený webhosting za pár kaček :)
Martin Kozibrátka0
Stálý člen
9. 6. 2013   #9
-
0
-

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?

Nahlásit jako SPAM
IP: 88.83.169.–
Savana.cz - neomezený webhosting za pár kaček :)
KIIV+42
God of flame
9. 6. 2013   #10
-
0
-

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...

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Martin Kozibrátka0
Stálý člen
9. 6. 2013   #11
-
0
-

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 

Nahlásit jako SPAM
IP: 88.83.169.–
Savana.cz - neomezený webhosting za pár kaček :)
Ovrscout
~ Anonymní uživatel
72 příspěvků
10. 6. 2013   #12
-
0
-

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))
 

Nahlásit jako SPAM
IP: 193.165.79.–
KIIV+42
God of flame
10. 6. 2013   #13
-
0
-

#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..

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 66 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý