Вопрос

В .net lock Ключевое слово - синтаксический сахар вокруг Monitor.Enter а также Monitor.Exit, так что вы могли бы сказать, что этот код

lock(locker)
{
  // Do something
}

такой же как

Monitor.Enter(locker);
try
{
  // Do Something
}
finally
{
  Monitor.Exit(locker);
}

Однако .NET Framework также включает MemoryBarrier класс, который работает аналогичным образом

Thread.MemoryBarrier();
//Do something
Thread.MemoryBarrier();

Я в замешательстве, когда я хотел бы использовать Thread.MemoryBarrier над lock/Monitor версия? Меня еще больше смущены Учебное пособие которые утверждают, что они функционируют то же самое.

Насколько я вижу, видимая разница не требует блокирующего объекта, который, я думаю, используя Monitor Вы могли бы сделать что -нибудь по темам, где MemoryBarrier на одном потоке.

Моя кишка говорит мне, что еще одно ключевое отличие MemoryBarrier предназначен только для переменных, а не для методов.

Наконец, это не связано с существующим вопросом Когда использовать «летучие» или «thread.memorybarrier ()» в коде блокировки Threadsafe? (C#), поскольку это сосредоточено на volatile Ключевое слово, которое я понимаю, его использование.

Это было полезно?

Решение

На мой взгляд, вы должны почти никогда использовать Thread.MemoryBarrier. Анкет Это используется для Без блокировки Код - убедиться, что изменения, внесенные в одну ветку, видны другому без затраты на замок. Оно делает нет синхронизация управления потоком, в отличие от lock. Анкет Я не вижу, где в учебном пособии Джо он говорит MemoryBarrier "функционирует так же, как и lock. Анкет Не могли бы вы объяснить, откуда вы получаете это впечатление?

На мой взгляд, код без блокировки низкого уровня слишком сложен практически для тех, кто кроме разработчиков, чье основное владение является параллелизмом. Если я хочу написать код без блокировки, я использую строительные блоки более высокого уровня построенный эти разработчики (такие как параллельные расширения в .NET 4.0), а не пытаются свернуть свои собственные.

Как бы пример, я недавно открыл глаза на точное значение volatile который не «Всегда читайте из основной памяти, всегда пишите непосредственно в основную память». (У моего собственного учебника по всему ногу все еще есть это объяснение в данный момент - что -то, что мне нужно исправить в какой -то момент.) Это гораздо более тонкое, чем это. Анкет Это означает, что немного моего предыдущего использования volatile вполне может быть неверным.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top