webForumDet fria alternativet

trådsäkert?!

.NETur .NET

7 svar · 483 visningar · startad av doggelito

Medlem sedan juni 20003 076 inlägg
Frågan#1

Har inte riktigt hajja trådning och dess konsekvenser så jag måste fråga!
Jag har denna statiska metod som kollar om gästrollen finns i listan.
Innebär det att en annnan användare skulle kunna få resultatet av denna lista och därmed i slutändan få tillgång till sidor den ej har behörighet till?

public class RoleInfo
{
        public static bool IsGuestVisible(IList<UserRole> roles)
        {
            foreach (UserRole r in roles)
            {
                if (r.Name == "Guest")
                    return true;
            }

            return false;
        }
}
Medlem sedan juni 20008 205 inlägg
#2

Inte om listan bara refereras av en enda tråd, nej. Metoden i sig är trådsäker, d.v.s, den modifierar inte något tillstånd som delas av flera trådar, förutsatt att listan som skickas in inte delas av flera trådar.

Medlem sedan juni 20003 076 inlägg
#3

Oki! Men hur vet man om listan delas av flera trådar? Är det nått man själv har skapat eller kan trådar klona sig själv så att säga?

Medlem sedan aug. 20003 575 inlägg
#4

Hmm, skriver någon annan tråd till listan kastas ju exception eftersom antalet objekt i listan ändras och det tillåter inte en foreach

Medlem sedan juni 20008 205 inlägg
#5

doggelito skrev:

Oki! Men hur vet man om listan delas av flera trådar? Är det nått man själv har skapat eller kan trådar klona sig själv så att säga?

Nej, trådar klonar inte sig själva. Om ett objekt refereras av >1 tråd beror det på att en referens antingen skickats in till startfunktionen för tråden, eller för att det finns en (direkt eller indirekt) static-referens till objektet. Är det något du själv new:ar och inte skickar till någon suspekt mottagare är det lugnt.

Medlem sedan maj 20012 812 inlägg
#6

Själv så brukar jag alltid använda mig av lock() så fort jag använder mig av trådar. Är det fall där man kan (rent programatiskt) ändra informationen från en annan tråd så åker det ditt ett lock() i bara farten för att säkra mot eventuella framtida problem med lock. Det gäller skrivning, oftast så behöver man inte ha lock om du bara skall läsa.

Man måste dock tänka på att man måste använda sig av samma lock-object annars så gör det inte så mycket nytta. Så jag brukar wrappa List<>/Collection<> eller vilken lista jag nu vill ha och slänga ditt en SyncLock properties på dessa, så om jag har en instans av en lista och den skickas runt mellan olika klasser så kan alla klasserna använda sig av samma lock-objekt. Eller så lockar du bara listan, vilket går det med...

Om man skapar lock-objektet i din klass och sedan skickar listan till en annan klass och skapar ett nytt lock-objekt i den klassen så blir inte din kod trådsäker, eftersom du då har låst på 2 olika objekt.

- M

Medlem sedan juni 20003 076 inlägg
#7

Det här med trådar är för mig ett stort svart hål! :(
Nån som vet en bra artikel/serie som tar upp trådning, gärna på svenska?

En struntfråga till då:
Får alla besökare som kommer till webbplatsen en egen tråd?

Medlem sedan juni 20008 205 inlägg
#8

doggelito skrev:

Får alla besökare som kommer till webbplatsen en egen tråd?

Nja - varje tråd behandlar bara en request åt gången (och i just ASP.NET behandlas requests från en klient av en tråd åt gången).

doggelito skrev:

Nån som vet en bra artikel/serie som tar upp trådning, gärna på svenska?

"Bra" och "på svenska" kommer sällan tillsammans. Jag rekommenderar dig att börja lattja lite med egna trådar i en enkel konsolapp så kanske det klarnar lite.
http://msdn.microsoft.com/en-us/library/system.threading.thread.aspx

129 ms totalt · 3 externa anrop · v20260731065814-full.b746b907
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)