C# - Multithreading - jak to vlastně je? – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

C# - Multithreading - jak to vlastně je? – .NET – Fórum – Programujte.comC# - Multithreading - jak to vlastně je? – .NET – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Xelender
~ Anonymní uživatel
5 příspěvků
25. 1. 2011   #1
-
0
-

Zdravím, měl bych pár otázek ohledně multithreadingu v C#. Snažím se to pochopit podle seriálu, který zde je. Celou dobu jsem měl za to, že vlákna sdílejí v podstatě všechno. Jenže poté v 10. díle je tento kód
[CODE] class ThreadUnsafe
{
static int x = 1000;
static void Go() { for (int i = 0; i < 100; i++) x--; }
} [CODE]
Předpokládal jsem tedy, že pokud tento kód zavolám 10 vlákny, sníží se pouze o x se sníží pouze o 100. (tedy v ideálním případě, protože občas více vláken zároveň přistoupí k proměnným etc.) V textu je však napsáno, že v ideálním případě by x bylo 0. To znamená, že každé vlákno si vytvoří vlastní kopii 'i'?

Nahlásit jako SPAM
IP: 92.62.224.–
Reklama
Reklama
Petrroll0
Stálý člen
25. 1. 2011   #2
-
0
-

Pravděpodobně jsi přeskočil úvod, je to zde krásně vysvětlené, viz. http://programujte.com/?akce=clanek&cl=2008061400-vlakna-v-c#-uvod

"CLR přiděluje každému vláknu jeho vlastní zásobník paměti, takže vlákna mohou mít své vlastní proměnné. "

Nahlásit jako SPAM
IP: 92.62.224.–
Xelender
~ Anonymní uživatel
5 příspěvků
25. 1. 2011   #3
-
0
-

Díky, ale pořád mi tu není jedna věc.
V kódu [CODE]static void Main()
{
new Thread(Pis).Start(); // Zavolá Pis() na novém vlákně
Pis(); // Zavolá Pis() na primárním vlákně
}
[/CODE] se vlastně také volá ze stejné instance ne? I ta třída ze které to volám musí mít nějakou instanci v momentě volání (tedy pokud není statická). V podstatě jsou oboje metody volány z 'this', tak jaký je rozdíl mezi tím, když volám ze základní instace a když volám z mnou vytvořené instance?

Nahlásit jako SPAM
IP: 92.62.224.–
Petrroll0
Stálý člen
25. 1. 2011   #4
-
0
-

No vzhledem k tomu, že Main je metoda statická tak this.bla volat nemůže. Pokud myslím správně, tak pokud bys to nevolal z statick. metody a volal to pomocí this.bla a new Thread(this.bla).Start() tak by to proměnné sdílelo.

Nahlásit jako SPAM
IP: 92.62.224.–
Xelender
~ Anonymní uživatel
5 příspěvků
25. 1. 2011   #5
-
0
-

Pravda, blbnu. Každopádně, pokud tedy nevolám (více vlákny) statickou metodu budou data sdílená (pokud volám metodu stejné instance). Pokud volám statickou, sdílená nebudou. Rád bych, kdyby mi někdo řekl proč.
Mám osobně takovou teorii, statická metoda se vytvoří vždy znovu (když je volána), díky tomu se vždy znovu (a pro každé vlákno) přidělí vlastní paměť. Zatímco pro metoda podřízená nějakému objektu se vytvoří jen jednou a to při jeho vytvoření.

Nahlásit jako SPAM
IP: 92.62.224.–
nervak0
Věrný člen
26. 1. 2011   #6
-
0
-

Normální členská proměnná je instanční, každá instance má vlastní hodnotu.
Statická členská proměnná je jediná hodnota přímo v typu.
Lokální proměnná metody je na zásobníku, každé vlákno má vlastní zásobník.
Typ metody s tím nesouvisí (a nevytváří se, ale prostě jsou), je to jen typem proměnných.

Takže všechna vlákna budou měnit stejné 'x', ale nebudou si hrabat na 'i'.

Nahlásit jako SPAM
IP: 213.211.51.–
KIIV+42
God of flame
26. 1. 2011   #7
-
0
-

a k tomu prvnimu dotazu "idealne 0" je mysleno pokud nedojde nahodou k "race condition"

tj. x se upravuje tak, ze se nejprve vyzvedne jeho aktualni hodnota, zmeni a ulozi nazpet
- nicmene po vyzvednuti se vlakno muze prerusit a zacne dalsi ta to mu pod "rukama" upavi x z 90 na 89..
jenze puvodni vlakno vyzvedlo 90 taky takze zmeni opet jen na 89... (si o tom neco precti - na netu bylo i par nazornejsich prikladu)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Xelender
~ Anonymní uživatel
5 příspěvků
26. 1. 2011   #8
-
0
-

Díky, už to asi doufám chápu. A existuje možnost jak sdílet lokální proměnou metody?

Nahlásit jako SPAM
IP: 188.120.193.–
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, 65 hostů

 

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