Nano Hash - криптовалюты, майнинг, программирование

Как понять образцы неправильной синхронизации в Go Memory Model

Я только начинаю изучать golang, когда читал Go Memory Model, у меня возник вопрос, чтобы понять, что это говорит о "Другая неправильная идиома занята ожиданием значения",

var a string
var done bool
func setup() {
    a = "hello, world"
    done = true
}
func main() {
    go setup()
    for !done {
    }
    print(a)
}

В нем говорится:

«Хуже того, нет никакой гарантии, что main когда-либо заметит запись в done, поскольку между двумя потоками нет событий синхронизации. Завершение цикла в main не гарантируется».

Я знаю, что порядок записи в «a» и «done» не является детерминированным в setup(). Мой вопрос: почему main не гарантирует, что запись будет выполнена?

Спасибо

08.05.2017

Ответы:


1
package main

var a string

var done bool

func setup() {
    a = "hello, world"
    done = true
}
func main() {
    go setup()
    for !done {
    }
    println(a)
}

У вас есть две горутины, основная и настройка. Например, предположим, что они выполняются в отдельных потоках на разных процессорах с кешем в локальной памяти. Предположим, что и main, и setup считывают переменную done в локальный кэш памяти ЦП. Горутина установки обновляет свой кеш локальной памяти, что делает ленивую запись. Поскольку нет события синхронизации кеша между независимыми основной и установочной горутинами, нет гарантии когерентности кеша, нет гарантии, что основная память и оба кеша памяти ЦП будут синхронизированы. Разное оборудование справляется с этим по-разному. В Go может быть гарантирован только наименьший общий знаменатель.

См. раздел согласованность кэша.

08.05.2017
  • Кроме того, если вы запускаете это в одном потоке, основная процедура, поскольку она имеет бесконечный цикл без вызовов функций или чего-либо еще, что могло бы вызвать планирование горутин, может потреблять 100% времени выполнения, никогда не позволяя setup() продолжить. Вот почему каналы являются общим решением для общения между горутинами. Общая аксиома в Go: не общайтесь, делясь памятью, делитесь памятью, общаясь. 08.05.2017
  • @Kaedys: В вопросе говорится, что мы работаем в двух потоках: между двумя потоками нет событий синхронизации. 08.05.2017
  • В самом вопросе не указано, сколько потоков ОС работает на OP, а только цитата из связанной статьи. Выделенная проблема OP (занятое ожидание значения) возникает здесь гораздо чаще из-за того, что основная процедура занимает 100% времени выполнения, чем из-за когерентности кеша. В любом случае оба заслуживают внимания, так как в данном случае любой из них может вызвать проблему в зависимости от используемой архитектуры. 08.05.2017
  • @kaedys, @peterSO, спасибо за четкое объяснение, когерентность кеша ЦП и горутина без функций не может получить расписание, новы для меня, кажется, есть много знаний, которые нужно изучить. 09.05.2017
  • Что касается горутины, важно помнить, что в горутине должна быть какая-то пауза. Чтение/запись в небуферизованный канал, запись на диск, консоль/журнал или что-то еще, вход в функцию — все эти действия могут привести к тому, что планировщик уступит место другой горутине. Однако, если у вас просто бесконечный цикл, эта горутина никогда не даст результата, а другие не смогут запуститься, если у вас нет нескольких доступных потоков ОС. Вот почему каналы так хороши для общения между горутинами. 09.05.2017
  • Например, ваш исходный код повторно реализован с использованием каналов для связи: play.golang.org/p/E5qq8X2j2S< /а> 09.05.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..