• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C# lock nie lockuje wątku

Cloud VPS
0 głosów
355 wizyt
pytanie zadane 11 listopada 2018 w C# przez Ditrix Mądrala (5,650 p.)

Hej,

W książce rozpocząłem temat wątków i lockowania danego wątku. Z tej okazji przepisałem prawie identyczny edukacyjny kod z książki, jednak u mnie nie dziala on prawidłowo. Powinno w danym momencie zalockować wątek, tak aby dany jeden wątek wyświetlił na konsoli liczby od 1 - 10, potem następny. Jednak tak się nie dzieje i wyświetlane są liczby z różnych wątków równolegle. Monitor.Enter() i blok try/finally to to samo co oznaczenie tej cześci kodu jako lock, także można zrobić po swojemu.

class Program
    {
        static void Main(string[] args)
        {
            Thread[] threads = new Thread[10];
            for(int i=0;i<10;i++)
            {
                threads[i] = new Thread(new ThreadStart(new Printer().Print));
                threads[i].Name = "Thread " + i;
            }

            foreach(Thread thread in threads)
            {
                thread.Start();
            }
            Console.ReadLine();
        }
    }

    class Printer
    {
        private readonly object threadlock = new object();
        public void Print()
        {
            Monitor.Enter(threadlock);
            try
            {
                for (int i = 0; i < 10; i++)
                {
                    Random random = new Random();
                    Console.WriteLine("Thread {0} : {1}", Thread.CurrentThread.Name, i);
                    Thread.Sleep(500 * random.Next(5));
                }
            }
            finally
            {
                Monitor.Exit(threadlock);
            }
        }
    }

Może popełniłem jakiś mały drobny błąd, może robię coś źle. Fajnie byłoby gdyby, ktoś zajrzał na ten kod i podpowiedział co robię źlę. Dzięki!

2 odpowiedzi

+2 głosów
odpowiedź 12 listopada 2018 przez monika90 Pasjonat (22,940 p.)
wybrane 12 listopada 2018 przez Ditrix
 
Najlepsza
U ciebie każdy wątek ma swój własny lock, a powinien być jeden wspólny lock dla wszystkich wątków.
komentarz 12 listopada 2018 przez Ditrix Mądrala (5,650 p.)
Dzięki wielkie! W książce był jednak błąd. I przy okazji zrozumiałem jak to działa.
0 głosów
odpowiedź 12 listopada 2018 przez pulson666 Stary wyjadacz (12,560 p.)
Nie brakuje Ci słówka await. Await ogólnie każe czekać aż wątek się zakończy

Podobne pytania

0 głosów
0 odpowiedzi 122 wizyt
pytanie zadane 21 sierpnia 2019 w C# przez Rafał Ciołek Nowicjusz (180 p.)
0 głosów
1 odpowiedź 187 wizyt
pytanie zadane 1 sierpnia 2016 w C# przez jankustosz1 Nałogowiec (36,960 p.)
0 głosów
1 odpowiedź 308 wizyt
pytanie zadane 27 lipca 2017 w C# przez Stami Gaduła (3,790 p.)

93,454 zapytań

142,448 odpowiedzi

322,717 komentarzy

62,832 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...