Как правильно заблокировать тип значения? - PullRequest
13 голосов
/ 07 января 2009

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

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

Спасибо

Ответы [ 4 ]

16 голосов
/ 07 января 2009

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

int valueType;
object valueTypeLock = new object();

void Foo()
{
    lock (valueTypeLock)
    {
        valueType = 0;
    }
}
14 голосов
/ 07 января 2009

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

1 голос
/ 07 января 2009

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

System.Threading.Interlocked.Exchange(valueType,0)
0 голосов
/ 07 января 2009

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

object syncObj = new object();

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...