Полезно ли ключевое слово volatile с ядром .net под процессором Intel? - PullRequest
0 голосов
/ 04 февраля 2019

Я пробовал несколько проблемных случаев, когда volatile полезно с .NET Framework.Однако в .NET Core я не нашел ни одного случая, когда волатильность действительно помогает.Является ли модель памяти с .NET Core более сильной, чем .NET Framework, так что нам больше не требуется энергозависимость?

В качестве примера следующий код на неопределенный срок блокируется с помощью .net Framework, если вы создаете его в режиме выпуска, но онне с .net core.Причина в том, что в случае .net значение сохраняется в регистре и кэшируется:

    class Program
    {
        static bool complete = false;
        static void Main()
        {

            var t = new Thread(() =>
            {
                bool toggle = false;
                while (!complete) toggle = !toggle;
            });
            t.Start();
            Thread.Sleep(1000);
            complete = true;
            t.Join();        // Blocks indefinitely
        }
    }

1 Ответ

0 голосов
/ 04 февраля 2019

Согласно этой статье , volatile в C # говорит компилятору / JIT выдавать инструкции, которые предотвращают переупорядочение команд.Хотя модель памяти .NET на платформах Intel обычно достаточно сильна, чтобы упорядочение происходило редко, на других платформах (например, ARM) вы об этом никогда не узнаете.

Другими словами, редко требуется использовать volatile, если вы не боитесь, что переупорядочивание может нарушить ваш код.В то же время, когда речь идет о многопоточности, всегда лучше быть в безопасности.

...