Čas:30.12.2010 5:13:58
Od:Vaclav Pech
Předmět:Odpoved
Hezka dusevni rozcvicka po ranu :) Typuji 4. Mam dojem, ze i chovani podle 5. by neodporovalo Java Memory modelu (zmena ne-volatilniho pole result se nebude propagovat do pametoveho prostoru druheho vlakna)
Čas:30.12.2010 10:03:35
Od:Petr Smid
Předmět:tip reseni
Tipuji, ze správně je 4), protože result není volatile.
Čas:30.12.2010 10:07:59
Od:Petr Smid
Předmět:Re: tip reseni
No jo, Vaclav ma jeste pravdu v tom, ze tim, ze result neni volatile, tak se nemusi vypropagovat do druheho vlakna.
Čas:30.12.2010 14:01:46
Od:Ladislav Thon
Předmět:Re: Re: tip reseni
Taky jsem tipoval 4, protože přiřazení do longu není atomické (jen když je volatile, což tady není). Ale žádnou bariéru tam nevidím, takže 5 je taky možnost.
Čas:30.12.2010 16:44:31
Od:Leoš
Předmět:chybí tam "memory barrier" (jak se tomu říká česky?)
Program se většinou zacyklí a bude okupovat 100% jednoho jádra CPU, protože podmínka p==0 v r2 bude stále splněná. Ve výjimečných případech dojde k přenesení hodnoty result z jednoho vlákna (r1) do druhého (r2) a pak program skončí.
Čas:30.12.2010 20:23:36
Od:Maaartin
Předmět:Zkusil jsem to
a skoro nikdy se to nezacyklilo. Presneji receno z 20 pokusu ani jednou. Paxem to spustil 100x paralelne a visejici vlakna mi zabraly vsecky 4 jadra (vrele doporucuju zabudovat timer co killne cely proces, jinak muzete mit problem co s tuhym compem). Muj tip byl 4+5, vetsinou -1, nekdy neco jinyho a nekdy se to zacykli. Jiny vysledek nez -1 jsem ale nevidel, nejspis proto ze mam 64-bitovou masinu. Ale za vylouceny to ani na ni nepovazuju, s interpretovanym kodem se to AFAIK muze stat, s prelozenym uz ne.
Čas:31.12.2010 1:48:08
Od:Jack FX
Předmět:Re: Zkusil jsem to
Lepší je přidat si cyklus přímo do metody main a uvidíte ... public static void main(String[] args) { for(int i = 0;i<100;i++) { add(0xeeeeeeee, 0x11111111); } }
Čas:31.12.2010 10:52:29
Od:Leoš
Předmět:Re: Zkusil jsem to
Java je multiplatformní - a na to nelze zapomínat. Takže z toho, jak se chová jedna implementace JVM (běžící např. na počítačí s Windows a starým jednojaderným CPU) nelze odvozovat, jak by se chovala jiná implementace JVM pod jiným OS na jiném hardware (např. Solaris s 64 jádry CPU). Prostě je třeba programovat důsledně podle specifikace Javy, a ne jen na jednu konkrétní implementaci JVM na jednom konkrétním hardware, jinak můžete být v budoucnu velmi nepříjemně překvapení.
Čas:31.12.2010 2:14:03
Od:Jack FX
Předmět:Doplňující otázka
Změní se nějak vysledek programu, když ve třídě Summator zaměníme long za int?
Čas:31.12.2010 10:42:58
Od:Leoš
Předmět:Re: Doplňující otázka
Výsledek bude téměř vždy stejný, ale s longem by mohlo výjimečně dojít i k výsledku jinému než -1 nebo zacyklení, protože přiřazení do longu nemusí být atomické (na rozdíl od přiřazení do intu).
Čas:1.1.2011 11:38:39
Od:Zdeněk Troníček
Předmět:Řešení
Potvrzuji, že správná odpověď je 4 + 5. Zápis do longu není atomický, takže se na 32 bitových procesorech může stát, že když jedno vlákno mění hodnotu proměnné long a druhé ji čte, druhé vlákno přečte hodnotu, která je z poloviny stará a z poloviny nová. Tj. první vlákno zapíše 4 bajty a dříve než zapíše další čtyři bajty, druhé vlákno hodnotu přečte. Na 64 bitových strojích toto nenastává. K zacyklení může dojít z toho důvodu, že chybí synchronizace. Když první vlákno změní hodnotu proměnné v hlavní paměti, tato změna nemusí být viditelná pro druhé vlákno, protože druhé vlákno může mít hodnotu proměnné např. v registru a nic jej nenutí, aby hodnotu znovu načetlo z hlavní paměti. Možnost 4 lze vidět při spuštění např. na notebooku, pro možnost 5 doporučuji víceprocesorový stroj (já jsem použil sunray). Pokud bychom místo typu long použili int, tak možnost 4 nenastane, protože zápis hodnoty int je atomický.
Diskuzní příspěvky
Vaclav Pech Odpoved
Petr Smid tip reseni
Petr Smid   Re: tip reseni
Ladislav Thon   Re: Re: tip reseni
Leoš chybí tam "memory barrier" (jak se tomu říká česky?)
Maaartin   Zkusil jsem to
Jack FX   Re: Zkusil jsem to
Leoš   Re: Zkusil jsem to
Jack FX Doplňující otázka
Leoš   Re: Doplňující otázka
Zdeněk Troníček Řešení