Avatar billede jopsen Nybegynder
22. februar 2007 - 21:50 Der er 1 kommentar og
1 løsning

Thread synkronisering, locks? tror jeg nok

Hej,

Jeg er igang med at skrive en stream ripper (code.google.com/p/thelastripper) som skole projekt (Teknologi på HTX).
Anyway, jeg er løbet ind i nogle problemer med alle de thread som System.Timers.Timer skaber. Jeg har nemlig en metode som foretager et http opkald, så den må gerne køre på sin egen thread. Men funktionen må IKKE blive kørt af 2 gange på engang, det giver store problemer i en anden del af koden.
På samme måde har jeg et sted hvor flere threads kan komme til at skrive til en fil på engang, derfor skal filen's handle selvfølgelig låses.
Jeg har kigget lidt på dokumentation af System.Threading.Monitor.Enter/TryEnter/Exit; men jeg har ikke få det til at virke.

For at forenkle spørgsmålet, har jeg lavet et lille eksempel af problemet:
[code]
    class MainClass
    {
        public static void Main(string[] args)
        {
            System.Timers.Timer T = new System.Timers.Timer();
            T.Interval = 1000;
           
            MainClass M = new MainClass();
           
           
            T.Elapsed += new System.Timers.ElapsedEventHandler(M.HandleTick);
           
            T.Start();
            Console.ReadLine();
            T.Stop();
            Console.ReadLine();
        }
       
        public System.String t = "hej med dig";
        public void HandleTick(System.Object Sender, System.Timers.ElapsedEventArgs Args)
        {
            //if(System.Threading.Monitor.TryEnter(this.t))
            //{
                System.Threading.Monitor.Enter(this.t);
                Console.WriteLine("Starting thread");
                this.t += "dhhj";
                System.Threading.Thread.Sleep(3000);
                Console.WriteLine("Ending Thread");
                System.Threading.Monitor.Exit(this.t);
            //}
        }
    }
[/code]

Jeg skal altså undgå at der komme til at stå "Starting thread" 2 gang lige efter hinanden i outputtet... Hvordan gør jeg det?
Det skal siges at jeg arbejde med både Mono og M$ .Net Framework 2.0
Det har lykkedes mig at gøre det ved at lave en boolean som jeg så give true/false alt efter om der er thread der er igang med arbejde i metoden. Men så vidt jeg ved, må man ikke rigtig tilgå variabler fra flere threads uden at låse dem... Men hvordan???

Håber der er nogen der kan hjælpe, mit program går ned engang i mellem, og vil slet ikke kører på dualcore pc'er :)
Avatar billede jopsen Nybegynder
25. februar 2007 - 20:26 #1
Nu har jeg selv fundet løsningen:http://www.albahari.com/threading/part2.html#_Locking
Det lader til det object jeg forsøger at låse skal være static... hvorfor, vil jeg stadig gerne vide???
Avatar billede spade Nybegynder
19. marts 2007 - 11:40 #2
Nu er spørgsmålet godt nok lukket, men jeg vil gerne give en forklaring :-)

statiske variabler er enkeltstående i applikationsdomænet. hvis du har 4 tråde lavet af Program1, så lever Program1 og de 4 tråde i samme applikationsdomæne, og siden den statiske variabel er enkeltstående for alle trådene, vil det være smart at låse på denne :-)
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