Avatar billede jtjansen Nybegynder
08. april 2009 - 09:33 Der 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;
    }
Avatar billede jtjansen Nybegynder
08. april 2009 - 14:13 #1
I følge det her burde det gælde.
http://msdn.microsoft.com/en-us/library/aa645755(VS.71).aspx

Men jeg kan ikke helt gennemskue i hvilket scope at volatile sikrer visibility?
Avatar billede jtjansen Nybegynder
08. april 2009 - 14:38 #2
Ville det fx også gælde her?

public class InnerClass
{
    string name;  <- her!
}

public class Test
{
    public volatile bool loaded;
    public InnerClass innerclas;
}
Avatar billede arne_v Ekspert
08. april 2009 - 15:30 #3
Ja og ja.

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.

Kort sagt: en volatile bool virker som den skal !
Avatar billede jtjansen Nybegynder
08. april 2009 - 15:58 #4
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.
Avatar billede arne_v Ekspert
08. april 2009 - 16:19 #5
Ja.

Men der er ikke meget pointe i det.

t1:
skriv en masse
flag = true

t2:
if(flag)
  laes en masse

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.
Avatar billede jtjansen Nybegynder
10. april 2009 - 19:31 #6
ja du har helt ret, det er ikke brugbart.

Læg gerne et svar - du har væreret yderst hjælpsom.
Avatar billede arne_v Ekspert
10. april 2009 - 19:48 #7
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester