@simply_user

Требует ли синхронизации обращение к статическим полям класса, имеющим значимый тип?

Здравствуйте!
Имеется следующий класс:
public static class ReadyUpload
    {
        public static bool filesRead;
        public static bool readAtLeastOneFile;
        public static bool listsReceived;
        public static bool excelIsRunning;

        public static bool CheckReadyUpload()
        {
           
        }
    }

Поля будут меняться в одной задаче, читаться - в другой, внутри метода CheckReadyUpload. Вопрос: нужно ли использовать какие-либо блокировки при записи и чтении?
Заранее спасибо.
  • Вопрос задан
  • 249 просмотров
Решения вопроса 1
lam0x86
@lam0x86
Блокировки не нужны. Но просто так записывать и читать поля из разных потоков тоже нельзя.
Вот смотрите: предположим, у вас многопроцессорная система. Один поток выполняется на одном процессоре, другой - на другом. У обоих процессоров есть свой кэш (точнее, несколько уровней кэшей). Если первый поток изменяет переменные (не важно, статические они или нет), то они не попадут в оперативную память до тех пор, пока процессор не сбросит кэш при помощи специальной инструкции. Поэтому, второй поток будет продолжать думать, что данные не изменились.
Для того, чтобы процессоры правильно работали с такими общими переменными придуманы барьеры памяти (memory barriers). Есть несколько способов поставить такие барьеры:
1) методы Thread.MemoryBarrier() / Thread.VolatileRead() / Thread.VolatileWrite()
2) добавить к полю модификатор volatile
3) использовать методы класса Interlocked
4) Использование блокирующих примитивов синхронизации (Monitor, ReaderWriterLockSlim, Events, Semaphores, Mutexes, etc.)

Без контекста задачи не ясно, что вам подойдёт в вашей задаче, но похоже, что достаточно пометить поля модификатором volatile.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Neuroware
@Neuroware
Программист в свободное от работы время
Нет, но если данные обновляются часто то могут возникать взаимные блокировки, которые устраняются автоматически, но могут откушать времени на отработку.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы