Подтвердить что ты не робот

Как правильно заблокировать тип значения?

Я читал о потоках и о блокировке. Обычно вы не можете (не должны) блокировать тип значения.

Итак, вопрос в том, каков рекомендуемый способ блокировки типа значения? Я знаю, что есть несколько способов сделать одно, но я не видел примера. Хотя на форумах MSDN была хорошая тема, но сейчас я не могу найти ее.

Спасибо

4b9b3361

Ответ 1

Используйте другой объект для блокировки.

int valueType;
object valueTypeLock = new object();

void Foo()
{
    lock (valueTypeLock)
    {
        valueType = 0;
    }
}

Ответ 2

Ваш вопрос сформулирован таким образом, что он подсказывает мне, что вы не совсем понимаете блокировку. Вы не блокируете данные, которые вы блокируете для защиты целостности данных. Объект, который вы блокируете, несуществен. Важно то, что вы блокируете один и тот же объект в других областях вашего кода, которые изменяют защищенные данные.

Ответ 3

В зависимости от ситуации вы можете избежать использования блокировок, используя System.Threading.Interlocked тот же код в примере Jon:

System.Threading.Interlocked.Exchange(valueType,0)

Ответ 4

Я всегда использую отдельную переменную для блокировки:

object syncObj = new object();

void Foo()
{
  lock(syncObj)
  {
    // do some stuff
  }
}

Блокировка значений типов не имеет никакого смысла, поскольку типы значений являются неизменяемыми и не могут быть изменены. Блокировка на 'this' также проблематична, поскольку 'this' видна внешнему миру.

Для получения некоторой информации о том, как изначально планировалось использовать монитор, см. Монитор (синхронизация)