Защищает ли замок вокруг крышки также содержимое крышки? - PullRequest
0 голосов
/ 03 апреля 2020

Предположим, у меня есть следующий код:

lock (this.myLock)
{
  this.myTimer = new Timer(_ =>
  {
    this.myConcurrentlyAccessedInt += 1;
  }, null, 1000, Timeout.Infinite);
}

Будет ли myLock защищать myConcurrentlyAccessedInt?

Примечание: Я знаю, что для этого варианта использования Interlocked - это то, что я должен использовать. Я просто использую этот простой пример как способ изучения семантики lock, оборачивающего замыкание. Я предполагаю, что это не защитит myConcurrentlyAccessedInt, но я бы хотел быть уверен.

1 Ответ

1 голос
/ 04 апреля 2020

lock само ключевое слово не защитит никакие переменные.

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

Согласно @Enigmativity made это ясно из комментариев:

Единственный способ, которым работает блокировка, - это если весь доступ к переменной защищен блокировкой.

В вашем случае myConcurrentlyAccessedInt является не защищенным myLock, поскольку приращение не выполняется в операторе, защищенном myLock.

Чтобы получить myLock для защиты myConcurrentlyAccessedInt, вам нужно будет читать и писать myConcurrentlyAccessedInt только в операторах, защищенных с помощью myLock.

Например, в приведенном ниже коде myConcurrentlyAccessedInt защищен myLock:

lock(myLock)
{
    this.myTimer = new Timer(_ =>
    {
        lock(myLock)
        {
            this.myConcurrentlyAccessedInt += 1;
        }
    }, null, 1000, Timeout.Infinite);

    this.myTimer2 = new Timer(_ =>
    {
        lock(myLock)
        {
            this.myConcurrentlyAccessedInt -= 1;
        }
    }, null, 1000, Timeout.Infinite);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...