Когда использовать блокировку против MemoryBarrier в .net
-
18-09-2019 - |
Вопрос
В .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
вполне может быть неверным.