лучший способ заблокировать объект - PullRequest
2 голосов
/ 06 января 2020

Я строю программу в C# с 2 потоками, которые используют один и тот же объект. первый поток обновляет значение объекта, а второй поток печатает его до GUI.

. Я ищу наиболее correct или clean способ реализации механизма блокировки между потоками.

пример реализации, которую я имею в моей программе (не в самой программе):

namespace Test___Console
{
    public class Custom
    {
        public static object lockinObject = new object();
        public string name;
        public int value;
        public Custom(string name)
        {
            this.name = name;
        }
    }
    public class Program
    {
        public static object lockinObject = new object();
        static Thread firstThread;
        static Thread secondThread;
        static public Custom someData;
        static void Main(string[] args)
        {
            someData = new Custom("first");
            firstThread = new Thread(FirstThreadFunctions);
            secondThread = new Thread(SecondThreadFunctions);
            firstThread.Start();
            secondThread.Start();
            do
            {

        } while (true);
    }
    static void FirstThreadFunctions()
    {
        Random rnd = new Random();
        do
        {
            someData.value = rnd.Next();
            Thread.Sleep(1000);
        } while (true);
    }
    static void SecondThreadFunctions()
    {
        do
        {
            Console.WriteLine(someData.value.ToString());
            Thread.Sleep(1000);
        } while (true);
    }
}
}

Я думал о 3 способах блокировки объекта someData

1.add get установить с объектом блокировки объект someData.

2.add получить с объектом блокировки переменные пользовательского класса.

3. инкапсулировать все сегменты кода, которые используют один и тот же объект данных с блокировкой операторы (мой наименее любимый метод).

У меня нет большого опыта программирования, поэтому я спрашиваю вас, каков "правильный" или "самый чистый" способ решения этой проблемы.

Спасибо

1 Ответ

1 голос
/ 06 января 2020

Вы хотите максимально ограничить свой код блокировки. Возьмем, к примеру, ваш случай.

По сути, вы пытаетесь заблокировать объект и предотвратить его чтение во время записи. Нет необходимости блокировать его при чтении с других читателей.

ReaderWriterLockslim до результата. Тогда в вашем Custom классе

public class Custom
{
    private ReaderWriterLockSlim cacheLock = new ReaderWriterLockSlim();

    private int currvalue;
    public int value {
        get {
            cacheLock.EnterReadLock();
            var retValue = currvalue;
            cacheLock.ExitReadLock();
            return retValue;
        }
        set {
            cacheLock.EnterWriteLock();
            this.currvalue = value;
            cacheLock.ExitWriteLock();
        }
    } 
}

Таким образом, вы ограничиваете параллелизм только для текущего объекта, который должен быть потокобезопасным, блокировка применяется очень близко к данным, чтобы не возникало взаимоблокировок быть легко введенным и только для действия письма.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...