Avatar billede jtjansen Nybegynder
07. april 2009 - 12:52 Der er 7 kommentarer

Volatile og readonly

Kan jeg undgå volatile keyword på variable som er readonly og som derfor kun sættes i konstruktøren?

Kan jeg derfor regne med at alle tråde vil kunne læse den variabel i en klasse (DateTime kan nemlig ikke sættes til volatile)?

private readonly DateTime created = DateTime.Now;
Avatar billede aaberg Nybegynder
07. april 2009 - 13:51 #1
Du skal kun bruge volatile keywordet på variabler som skal modificeres af mange tråde på samme tid. Skal du bare læse variablen, er det unødvendigt at bruge volatile

Så svaret på dit spørgsmål, må være: ja.
Avatar billede jtjansen Nybegynder
07. april 2009 - 14:18 #2
det tænkte jeg sådan set også. Var bare bange for at en tråd konstruere objektet og en anden tråd aflæser en forkert værdi, men det er jo nok garanteret at startværdier altid kan læses korrekt også uden volatile.
Avatar billede aaberg Nybegynder
07. april 2009 - 15:14 #3
Ja, jeg er ret sikker på du ikke får problemer, så længe du har med readonly variabler at gøre.
Avatar billede arne_v Ekspert
08. april 2009 - 01:54 #4
Du kan godt få multi threaded problemer selv med en readonly variabel.

De to potentielle problemer er:
* atomicity - du kan risikere at en anden tråd læser feltet mens constructor initialiserer det og får en inkonsistent værdi fordi kun en del af structen har fået dens værdi
* visibility - du kan risikere at tildelingen kun ligger i den ene CPU/kerne's cache og ikke kan ses fra kode der kører på en anden CPU/kerne

Hvis andre synkroniserings mekanismer garanterer mod disse, så skulle readonly være OK.
Avatar billede jtjansen Nybegynder
08. april 2009 - 09:36 #5
Hej arne.

Men vil andre tråde kunne få fat i objektet, hvis 1. tråd ikke er færdig med at initialiser det?
Avatar billede arne_v Ekspert
09. april 2009 - 02:28 #6
Hvis din kode er bare nogenlunde normal, så bør en tråd ikke kunne få fat i objektet inden constructor er færdig (hvis man kalder en metode med this som argument inde i constructor så har man skudt sig selv i foden).

Men bemærk at det kun løse atomicity problemet. Det løser ikke visibility problemet. Selvom constructor afsluttes kan data fint ligge og hygge sig i en kerne specific L1 cache der ikke kan ses af en anden kerne.
Avatar billede arne_v Ekspert
05. juli 2009 - 22:03 #7
jtj ?
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