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'?
Fórum › .NET
C# - Multithreading - jak to vlastně je?
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é. "
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?
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í.
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'.
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)
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Jak je to s tím kreslením vlastně (?) — založil pidgin
Jak vlastně funguje session? — založil
Multithreading — založil michal
Multithreading — založil Filip0913
Moderátoři diskuze