Avatar billede martinbk Nybegynder
18. januar 2008 - 15:58 Der er 7 kommentarer og
1 løsning

Hashtable og thread-safety

Hejsa

jeg har et mindre problem som giver mig en del hovedpine, jeg sidder  og forsøger at iterere over en hashtable og for hver iteration spawne en ny tråd, en gang imellem sker det dog at jeg får samme object 2 gange, forsøgte så at synkronisere tabellen men synes ikke rigtig jeg kan få det til at køre som jeg vil

Hashtable threadTable = (Hashtable)entries[searchString];
lock(threadTable.SyncRoot)
{
  foreach (DictionaryEntry entry in threadTable)
  {
    new Thread(delegate() { commit(entry, searchString); }).Start();
  }
}


så helt enkelt, hvordan synkroniserer jeg adgangen til objecterne i den hashtable, så hver tråd får sit unikke object ?
Avatar billede davidfossil Nybegynder
23. januar 2008 - 00:04 #1
Husker du også at benytte "lock" alle de steder hvor du indsætter i tabellen?

Alternativt: er du sikker på at samme objekt ikke (pga. fejl andetsteds) optræder flere gange i din Hashtable?
Avatar billede martinbk Nybegynder
23. januar 2008 - 00:49 #2
ja jeg er 110% sikker på objecterne kun er der en gang, og min commit metode indsætter intet, den læser kun, alt indsættelse er single trådet fra en database
Avatar billede jeppekristensen Nybegynder
25. januar 2008 - 21:33 #3
Hvor mange Tråde regner du maks med der vil være? Worst case scenarie
Avatar billede martinbk Nybegynder
25. januar 2008 - 22:50 #4
50 >< 100
Avatar billede jeppekristensen Nybegynder
26. januar 2008 - 01:54 #5
Jeg ville nok nærmere benytte en generisk list (list<t>). En hashtable ville jeg mere bruge som en opslagsbog (ordbog osv.). Men det er selvfølgelig en smagssag. Du kunne eventuelt lade en klasse håndtere de forskellige tråde og så tilføje dem med en AddThread metode som tjekker om den pågældende tråd allerede er i din liste før du tilføjer tråden.
Avatar billede martinbk Nybegynder
26. januar 2008 - 04:21 #6
kan ikke rigtig se hvad forskellen skulle være på at bruge en generisk liste, udover at den ikke kan indeholde et key,value par som en hashtable kan, alternativet var måske en generic dictionary, men igen kan ikke helt se hvad forskel det skulle give i den her situation
Avatar billede jeppekristensen Nybegynder
26. januar 2008 - 13:47 #7
Jeg tror muligvis at en generisk liste er lidt mere forudsigelig når du løber den igennem med en foreach. Jeg er ikke sikker, men en hashtable løber ikke nødvendigvis lineært igennem sit collectiondata. Den måde de gemmer data på er meget forskellige.

Jeg ved ikke om det er det der giver problemerne, men ville bare sikre mig at du var opmærksom på forskellene.

Rent performance mæssigt tror jeg også at det er hurtigere at fylde data i en generisk liste eller umærkbart. Jeg ved ikke om du ønsker at søge efter de forskellige tråde, men rent performance mæssigt går det meget hurtigt med at søge 50-100 ting igennem.
Avatar billede martinbk Nybegynder
10. oktober 2010 - 02:24 #8
tror jeg vælger at lukke denne, endte entlig med at droppe projektet.
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