Avatar billede stigc Nybegynder
02. juni 2004 - 19:34 Der er 27 kommentarer og
2 løsninger

ASP application variables

Jeg skal lige har bekræftet/afkræftet en række ting. Det drejer som om data som ca. 100 klienter skal kunne tilgå samtidig. Jeg går udfra at flere klienter kan læse fra en application variable samtidig, eller hvad? Kan der være problemer med at ændre værdien, hvis flere 100 klienter bruger den? Er det noget andet der er hurtigere end application variables? Hvad med cache objektet?
Avatar billede burningice Nybegynder
02. juni 2004 - 21:58 #1
application["et eller andet"] er der jo netop for at kunne gemme nogle ting hele applikationen skal kunne se, så det må være den mest rigtige at bruge

ang. dine hundrede brugere, så sørg for at lave en Lock på din variabel før du ÆNDRER den. Det er ikke noget problem at læse variablen, også selvom der er 34 der gør det samtidig.
Avatar billede arne_v Ekspert
03. juni 2004 - 20:39 #2
Øh - det gælder vel kun hvis operationerne på data er atomiske ?

(typisk kun simple data typer som int og lignende)

Ellers skal der vel også låses ved læsning.
Avatar billede burningice Nybegynder
03. juni 2004 - 20:53 #3
okay... så aflæsning af f.eks. en klasse kan godt ændre ved indholdet?
Avatar billede burningice Nybegynder
03. juni 2004 - 20:55 #4
jeg spørger, da jeg er nysgærrig, og havde den opfattelse at så længe man ikke ændrer ved data, bare aflæser dem, så er der mange der kan gøre det på samme tid uden at der burde ske noget
Avatar billede arne_v Ekspert
03. juni 2004 - 20:59 #5
Nej - men man kan få inkonsistent læsning.

Det er ikke et problem med flere samtidige læsninger. Men det er et problem med
1 opdatering + 1 eller flere læsninger samtidigt.

Eksempel:

vi har 2 integers en med kroner og en med ører
vi ændrer fra 1 50 til 2 10

scenarie 1:

tråd 1 ændrer 1 til 2
tråd 1 ændrer 50 til 10
tråd 2 læser 2 10
helt fint

scenarie 2:

tråd 2 læser 1 50
tråd 1 ændrer 1 til 2
tråd 1 ændrer 50 til 10
helt fint


scenarie 3:

tråd 1 ændrer 1 til 2
tråd 2 læser 2 50
tråd 1 ændrer 50 til 10
ikke smart

En tråd har læst en værdi som logisk set aldrig har eksisteret.

Derfor bør man som ofest også låse ved læsninger.
Avatar billede stigc Nybegynder
03. juni 2004 - 21:03 #6
Jeg skal f.eks have et array af data for 100 forskellige land. Array består af en streng på ca. 1000 tegn. Værdien skal tilgås således

string data = arrData[landeid];

Typisk bliver der, via et administrationsmodul, kun ændret en lande streng adgangen. Måske de skulle ligge i hver deres applications variable? Et array af applikations variabler af typen string?
Avatar billede stigc Nybegynder
03. juni 2004 - 21:08 #7
Så skal arrayet selvfølgelig også være en applikationsvariable.

Kan man have et array som er en applikationsvariable, som indeholder strenge, som også er applikationsvariable? Så kan man vel nøjes med at låse den plads der skal ændres, eller hvad?
Avatar billede arne_v Ekspert
03. juni 2004 - 21:11 #8
Låse er koorperative d.v.s. at det er fuldstændigt ligegyldigt hvad du låser på
bare dem der skal synkroniseres låser på det samme.
Avatar billede stigc Nybegynder
03. juni 2004 - 21:23 #9
arne_v>> Jeg er ikke helt med.
Avatar billede arne_v Ekspert
03. juni 2004 - 21:29 #10
Når man låser på et objekt forhindrer man ikke andre i at opdatere
objektet - man forhindrer kun andre i at få lås på objektet.

D.v.s. at alle som skal synkroniseres skal låse.

Og det er derfor også ligegyldigt om man låser på det objekt der skal
ændres eller man låser på et helt andet objekt. Bare alle låser på
det samem objekt, så virker det fint. Det giver selvfølgelig mest
læsbar kode at låse på det man skal beskytte mod samtidige rettelser.
Avatar billede stigc Nybegynder
03. juni 2004 - 21:43 #11
Ok. Jeg er med.

Hvis en tråd har låst en objekt, og en anden tråd prøver at låse sammen objekt, så venter tråden vel indtil den får låsen?
Avatar billede burningice Nybegynder
03. juni 2004 - 21:49 #12
arne_v>> så var jeg da også rigtig på den. Jeg skrev jo netop at han skulle huske at låse variablen før en opdatering
Avatar billede arne_v Ekspert
03. juni 2004 - 21:52 #13
stig>

Ja - en anden tråd vel vente indtil den kan komme til
Avatar billede arne_v Ekspert
03. juni 2004 - 21:53 #14
cf>

Ja der skal låses både i de tråde der skriver og i de tråde der læser.

Scenario 3 er muligt hvis der kun låses i tråd 1.

Scenarie 3 er ikke muligt hvis der låses i både tråd 1 og 2.
Avatar billede stigc Nybegynder
03. juni 2004 - 22:07 #15
Læg et svar arne_v.

Jeg har lige et sidste spm. Jeg har som sagt mange klienter der tilgår samme data. Jeg havde forstillet mig at hvis applikations varaiblen er tom, så slås den op i en database. Dette kan dog tage lang tid, og jeg ønsker ikke at flere klienter/tråde gør det samtidigt. Kun den første. Er det muligt at gøre noget ala dette pseudo-kode? Eller findes der en mere snedige (læs performance-venlig) måder at gøre dette på?

if (application["test"]=="")
{
    if (!application["test"].isLocked())
    {
        application["test"].lock();
        application["test"] = getDataFromDatabase();
        application["test"].unlock();
    }
    else
        while (application["test"]=="")
            sleep(100);
}


String t = application["test"];
Avatar billede arne_v Ekspert
03. juni 2004 - 22:13 #16
Jeg ville nok bare lave det som (med det forbehold at jeg ikke kender ASP.NET application):

application["test"].lock();
if (application["test"]=="")
{
  application["test"] = getDataFromDatabase();
}
application["test"].unlock();
Avatar billede arne_v Ekspert
03. juni 2004 - 22:17 #17
Et svar

Skal cf ikke også svare ?

Han svarede jo på spørgsmålet om application var hensigtsmæssigt.

Og jeg ved rigtigt meget om tråde og låse, men jeg ved intet om
ASP.NET ...
Avatar billede stigc Nybegynder
03. juni 2004 - 22:21 #18
Ja, cyberfessor læg du også et svar.

arne_v>> Men så låser du den for hver læsning, hvormed flere klienter/tråde ikke kan læse den samtidig, eller hvad? Jeg går efter højeste performance!
Avatar billede arne_v Ekspert
03. juni 2004 - 22:25 #19
lock + simpelt test + unlock bør ikke tage ret lang tid

Du kan muligvis optimere lidt ved at bruge såkaldt double locking:

if (application["test"]=="")
{
  application["test"].lock();
  if (application["test"]=="")
  {
      application["test"] = getDataFromDatabase();
  }
  application["test"].unlock();
}
Avatar billede stigc Nybegynder
03. juni 2004 - 22:37 #20
:) Ja, den er købt! Den giver mulighed for samtidig læsning. Og den 100% sikre må vel være:

string test = application["test"];
if (test==application["test"])
{
  application["test"].lock();
  if (application["test"]=="")
  {
      application["test"] = getDataFromDatabase();
  }
  application["test"].unlock();
  test = application["test"];
}
Avatar billede stigc Nybegynder
03. juni 2004 - 22:38 #21
cyberfessor?
Avatar billede arne_v Ekspert
03. juni 2004 - 22:55 #22
Den her forstår jeg ikke:

string test = application["test"];
if (test==application["test"])
Avatar billede arne_v Ekspert
03. juni 2004 - 22:56 #23
Me dhensyn til cf så giv ham lidt tid - nogle har også andet at bruge en
torsdag aften til end at hænge på E
Avatar billede stigc Nybegynder
03. juni 2004 - 22:59 #24
Selvfølgelig:

string test = application["test"];
if (test=="")
{
  application["test"].lock();
  if (application["test"]=="")
  {
      application["test"] = getDataFromDatabase();
  }
  application["test"].unlock();
  test = application["test"];
}
Avatar billede arne_v Ekspert
03. juni 2004 - 23:03 #25
Er det ikke bare en overflødig variabel som skal GC'es ?
Avatar billede stigc Nybegynder
03. juni 2004 - 23:03 #26
For der vel en teoretisk mulighed for at applikations variablen er tom efter.

if (application["test"]=="")
{
  application["test"].lock();
  if (application["test"]=="")
  {
      application["test"] = getDataFromDatabase();
  }
  application["test"].unlock();
}



Faktisk skal det vel være:

string test = application["test"];
if (test=="")
{
  application["test"].lock();
  if (application["test"]=="")
  {
      application["test"] = getDataFromDatabase();
  }
  test = application["test"];
  application["test"].unlock();
 
}


Men jeg takker da for en givtig tråd. Lukker en anden dag.
Avatar billede stigc Nybegynder
03. juni 2004 - 23:06 #27
Jeg skulle gerne ende med at have en lokal varaible med indeholdet fra applkations variablen (her er det "test")
Avatar billede arne_v Ekspert
03. juni 2004 - 23:09 #28
OK så forstår jeg !
Avatar billede burningice Nybegynder
04. juni 2004 - 10:17 #29
ser ud til at i to har hygget jer ;)
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
Kurser inden for grundlæggende programmering

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