Потокобезопасный код - 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(); 
                }
}
Но я что-то не верю этому коду или что-то не понимаю или ничего не понимаю. Объясните, пожалуйста, или хотя бы направьте в нужном направлении.

Код к задаче: «Потокобезопасный код - C#»

textual
lock(countReaders)
{
}
Эта работа вам не подошла?

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

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


СДЕЛАЙТЕ РЕПОСТ