Какова цель объединения MemoryBarrier в .NET? ⇐ C#
Какова цель объединения MemoryBarrier в .NET?
Пример кода с https://www.albahari.com/threading/part4.aspx
класс Foo { интервал _ответ; bool _complete; пустота А() { _ответ = 123; Thread.MemoryBarrier(); // Барьер 1 _complete = правда; Thread.MemoryBarrier(); // Барьер 2 } пустота Б() { Thread.MemoryBarrier(); // Барьер 3 если (_завершено) { Thread.MemoryBarrier(); // Барьер 4 Console.WriteLine(_ответ); } } } Барьеры 1 и 4 не позволяют этому примеру записать «0». Барьеры 2 и 3 обеспечивают гарантию свежести: они гарантируют, что если B побежит после A, чтение _complete будет иметь значение true.
Я понимаю, что цель Thread.MemoryBarrier() — обеспечить полный барьер памяти, чтобы код над ним и код под ним не перепрыгивали, но что это значит? Барьер 2 здесь делать? после Барьера 2 нет кода, почему автор до сих пор использует барьер, чтобы не дать существующему коду перепрыгнуть через барьер? как пары барьеров 2 и 3 работают вместе, обеспечивая гарантию свежести?
Пример кода с https://www.albahari.com/threading/part4.aspx
класс Foo { интервал _ответ; bool _complete; пустота А() { _ответ = 123; Thread.MemoryBarrier(); // Барьер 1 _complete = правда; Thread.MemoryBarrier(); // Барьер 2 } пустота Б() { Thread.MemoryBarrier(); // Барьер 3 если (_завершено) { Thread.MemoryBarrier(); // Барьер 4 Console.WriteLine(_ответ); } } } Барьеры 1 и 4 не позволяют этому примеру записать «0». Барьеры 2 и 3 обеспечивают гарантию свежести: они гарантируют, что если B побежит после A, чтение _complete будет иметь значение true.
Я понимаю, что цель Thread.MemoryBarrier() — обеспечить полный барьер памяти, чтобы код над ним и код под ним не перепрыгивали, но что это значит? Барьер 2 здесь делать? после Барьера 2 нет кода, почему автор до сих пор использует барьер, чтобы не дать существующему коду перепрыгнуть через барьер? как пары барьеров 2 и 3 работают вместе, обеспечивая гарантию свежести?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение