Потокобезопасный код - C#

Узнай цену своей работы

Формулировка задачи:

Всем добрый день! Мне нужно разработать свойство, которое разрешает одновременно получать значение поля в нескольких потоках. После того, как все читатели завершают процесс чтения, возникает событие.
public string SharedRes
        {
            get
            {               
                // Some safety code
                Interlocked.Increment(ref countReaders); // увеличиваем счетчик читателей
                DoSomeWork(); 
 
                if (Interlocked.Decrement(ref countReaders) == 0)
                {
                    writerWork.Set(); 
                }
 
                return sharedRes;               
            }
 
            set
            {
                //Some code         
            }
        }
Вот этот кусок кода надо сделать потокобезопасным. Ведь может получиться так, что, после проверки условия, переменная countReaders увеличится на единицу в другом потоке. А в этом случае событие не должно наступить.
if (Interlocked.Decrement(ref countReaders) == 0)
                {
                    writerWork.Set(); 
                }
Встречал что-то такое:
lock(countReaders as object)
{
if (Interlocked.Decrement(ref countReaders) == 0)
                {
                    writerWork.Set(); 
                }
}
Но я что-то не верю этому коду или что-то не понимаю или ничего не понимаю. Объясните, пожалуйста, или хотя бы направьте в нужном направлении.

Решение задачи: «Потокобезопасный код»

textual
Листинг программы
lock(countReaders)
{
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.091 из 5