Что касается .NET, то вход монитора (оператор lock
) имеет семантику, поскольку он неявно выполняет изменчивое чтение и выход из монитора (конец блока lock
) имеет семантику выпуска, так как она неявно выполняет волатильную запись (см. §12.6.5 Замки и потоки в Common Language Infrastructure (CLI) Partition I).
volatile bool areWeThereYet = false;
// In thread 1
// Accesses, usually writes: create objects, initialize them
areWeThereYet = true;
// In thread 2
if (areWeThereYet)
{
// Accesses, usually reads: use created and initialized objects
}
При записи значения areWeThereYet
, все доступы до того, как были выполнены и не заказана, чтобы после летучего записи.
Когда вы читаете с areWeThereYet
, последующие обращения не переупорядочиваются до более неустойчивого чтения.
В этом случае, когда поток 2 отмечает, что areWeThereYet
изменился, у него есть гарантия, что следующие обращения, как правило, читаются, будут наблюдать за образами других потоков, как правило, пишет. Предполагая, что с затронутыми переменными не существует другого кода.
Что касается других примитивов синхронизации в .NET, таких как SemaphoreSlim
, хотя это явно не задокументировано, это было бы бесполезно, если бы они не имели подобной семантики. Программы, основанные на них, могут, по сути, даже не работать корректно в платформах или аппаратных архитектурах с более слабой моделью памяти.
Многие люди разделяют мысль, что Microsoft должна обеспечивать сильную модель памяти на таких архитектурах, подобных x86/amd64, чтобы сохранить текущий код базы (Microsoft, собственных, так и их клиентов) совместимы.
я не могу проверить себя, так как я не имею ARM устройства с Microsoft Windows, намного меньше с .NET Framework для ARM, но, по крайней мере, один статьи в журнале MSDN Эндрю Пардо, CLR - .NET Development for ARM Processors, говорится:
CLR разрешает выставлять более сильную модель памяти, чем требуется спецификация CLI ECMA. Например, на x86 модель памяти CLR сильна, потому что модель памяти процессора сильная. Команда .NET могла бы сделать модель памяти на ARM такой же сильной, как модель на x86, но обеспечение идеального порядка, когда это возможно, может оказать заметное влияние на производительность выполнения кода. Мы провели целенаправленную работу по усилению модели памяти на ARM - в частности, мы вставили барьеры памяти в ключевые моменты при написании в управляемую кучу, чтобы гарантировать безопасность типа, но мы сделали это только с минимальным воздействием сверху производительность. Команда провела несколько обзоров проектов с экспертами, чтобы убедиться, что методы, применяемые в CLR ARM, были правильными. Более того, тесты производительности показывают, что производительность выполнения кода .NET оценивается так же, как и собственный код на C++ при сравнении между x86, x64 и ARM.
Hi Jon, извините, что уволил эту ветку комментариев, но это похоже на хорошее место для моего вопроса, есть ли где-то спецификационный документ C# 6 или 7? Я знаю, что Mads Torgersen упоминал где-то, что у него есть проект для C# 6, который он должен опубликовать, но я никогда не видел, если бы он это сделал. Я чувствую, что, если кто-нибудь знает о таком документе, это будет вам :) –
@Damien_The_Unbeliever: Вы правы, будете редактировать. –
@ LasseV.Karlsen: есть черновик спецификации C# 6 на https://github.com/ljw1004/csharpspec, но он * - это просто черновик. Мы по-прежнему заканчиваем стандартизацию спецификации C# 5 для ECMA, которая имеет эффект постукивания для более поздних версий, поскольку мы надеемся согласовать ECMA и MS. –