Avatar billede jtjansen Nybegynder
15. august 2008 - 18:23 Der er 4 kommentarer og
1 løsning

Thread safe adgang til dictionary

Jeg bliver lidt i tvivl om hvordan jeg skal gøre min læse/skrive adgang til et dictionary thread safe. Jeg vil gerne opnå at flere kan læse, men kun en kan skrive. Jeg ved at ReaderWriterLock vil kunne gøre det for mig, men tænker at nedenstående kode er endnu hurtigere, da der kan læses imens der skrives. Men er det thread safe at læse en key imens en anden key skrives? De to TryGetValue skyldes, at jeg ikke ønsker at to tråde slår den samme værdi op. For nemhedens skyld lægges der bare en streng i dictionary, men det kunne fx være et databaseopslag.

class MyCache
{
    static object l = new object();
    static Dictionary<int, string> dic = new Dictionary<int, string>();
   
    static string Get(int id)
    {
        string result = null;
        if (!dic.TryGetValue(id, out result))
        {
            lock (l)
            {
                if (!dic.TryGetValue(id, out result))
                {
                    dic.Add(id, "id " + id);
                }
            }
        }
        return result;
    }
}
Avatar billede arne_v Ekspert
15. august 2008 - 18:33 #1
Den kode er ikke thread safe.

Din lock del er OK hvis anden kode det bruger dic også bruger samme lock objekt. Jeg ville
bruge dic selv, men det er der delte meninger om.

Men det kan gå galt med din første TryGetValue hvis den kører samtidigt med
at en anden tråd er igang med en Add.
Avatar billede jtjansen Nybegynder
15. august 2008 - 18:49 #2
ok. Men hvad er det som går galt? Altså internet i dictionary'et?
Avatar billede arne_v Ekspert
15. august 2008 - 19:10 #3
Hvis der ikke er plads i hash tabellen, så kan add blive nødt til at udvide den
og flytte rundt på data. Og så kan TryGetValue returnere hvad som helst.
Avatar billede jtjansen Nybegynder
27. august 2008 - 18:59 #4
mange tak for svaret. Læg gerne et svar.
Avatar billede arne_v Ekspert
27. august 2008 - 19:12 #5
ok
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