08. april 2009 - 09:33Der er
6 kommentarer og 1 løsning
Volatile variabler
Hvis en variable i en klasse er volatile (loaded) og denne variable bruges til at kommunikere på tværs af tråde, er det så sikret at andre variabler (fx name) er "up to date"?
public class Test { public volatile bool loaded; public string name; }
Problemet med visibility drejer sig om at en traad der koerer paa en CPU/kerne kan gemme data i et register eller i noget ikke delt cache og det derfor ikke kan ses af aen traad som koerer paa en anden CPU/kerne.
Volatile sikrer at hvis en traad skriver noget til den volatile variabel, saa vil alle andre traade kunne se rettelsen.
Og (nu kommer den helt store pointe) hvis traad 1 skriver til noget andet f.eks. innerclass inden den skriver til den volatile variabel, saa er der ogssa garanteret at hvis en anden traad foerst laeser den volatile variabel og derefter innerclass, saa vil ogsaa opdateringen af denne vaere synlig.
Tak for svaret arne_v. Jeg bliver ved lidt endnu. Dette er jo super vigtigt og umuligt at teste sig ud af.
Er følgende udsagn så sandt?
Alt hvad en tråd har ændret af data kan med garanti aflæses fra en anden tråd, hvis første tråd "rører" en volatile field? Tråd nummer 2 behøver ikke engang at aflæse samme volatile field.
virker fordi bruget af flaget sikrer at t1 er faerdig med at skrive inden t2 laeser
t1: skriv en masse flag1 = true
t2: if(flag2) laes en masse
virker ikke rigtigt. Hvis flag1 og flag2 er volatile saa vil de sikre konsistens af data naar de bliver brugt, men t2 kan jo ikke vide at t1 er faerdig med at skrive, saa t2 ved kun at det han laeser er det samme som t1 har skrevet men t2 ved ikke om t1 er faerdig med at skrive.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.