[C#] wielowątkowość - blokowanie obiektów


(Maciej Jl) #1

Witam, zmagam się z pewnym zagadnieniem, otóż w pewnym wątku chcę zablokować cały obiekt przed dostępem (odczyt, zapis, metoda, właściwość).

Oczywiście kod poniżej to tylko przykład, w rzeczywistości dane do których dostęp chce synchronizować są złożone.

Nie jestem pewien czy użycie lock(...){...} tak jak na przykładzie zadziała, tak jak bym tego chciał, a to chyba wszystko wina dokumentacji,

bo jest tam napisane że 'lock' blokuje wykonanie fragmentu kodu zawartego w klamrach. Nie jestem pewien więc pytam :slight_smile:

public class AnalogInputClass

    {

        private object lockObject = new object();

        public bool Running = true;

        public int Value { get; private set; }


        public void ModifyValue(int x)

        {

            Value = x;

        }


        // Ta metoda jest wywoływana w osobnym wątku

        public void ValueRefresh()

        {

            while (Running)

            {

                lock (lockObject)

                {

                    Thread.Sleep(50); // symulacja czasochłonnej operacji pobierania danych

                    //

                    Value = 2; // uaktualnia pobrane dane (dla przykładu 2)

                }

            }

        }

    }


    public class MainClass

    {

        public static void Main()

        {

            AnalogInputClass aic = new AnalogInputClass();


            Thread thread = new Thread(new ThreadStart(aic.ValueRefresh));

            thread.Start();


            // Chce miec pewność że ta metoda nie zostanie wywołana w momencie 

            // gdy obiekt jest modyfikowany wewnątrz ValueRefresh()

            aic.ModifyValue(300);

        }


    }

(tak wiem mogę sobie napisać programik i sprawdzić czy będzie działać tak jak trzeba, ale może na forum (przy okazji) dowiem się czegoś więcej)

Z góry dzięki za zainteresowanie.


(Fiołek) #2

Jak dla mnie, MSDN wszystko dobrze opisuje. Można jeszcze poczytać o sekcjach krytycznych.

Co do kodu:

Aby działał tak jak chcesz w metodzie ModifyValue też musisz dać sekcje krytyczną z "lock(lockObject)", bo skąd niby ma "komputer" wiedzieć, że chodzi o "tą samą"(odwołującą się do tych samych zmiennych) sekcje krytyczną? :wink: