отсутствие гарантий сериализации доступа к переменной приведет к тому, что когда-то, теоретически, в данном коде сработает условие на 25 строке? https://goplay.space/#YOKs0MBPmYM Я запустил этот код локально, 50 тысяч горутин инкерементируют uint и проверяют значение, уже полчаса никаких сбоев. Значит, что тест неправильный или просто вероятность сбоя небольшая?
то есть всё, что мы можем сказать об атомиках - компилятор не сделает реордеринг и другие ядра не увидят промежуточных значений операции?
Не означает не будет реордеринга. Просто к ячейке памяти будет эксклюзивный доступ при получении или зменении.
вы сейчас про мьютексы, кажется)
Мютекс позволяет эксклюзивно выполнять блок команд.
https://goplay.space/#dZKNQueqv7i Я чуть причесал ваш код. Условие никогда не сработает.
Внесите if atomic.LoadUint64(&ops) куда-нибудь сразу после atomic.AddUint64 и все заиграет новыми красками
нужно дождаться завершения работы всех рутин, раньше проверку вставлять нет смысла
мы просто выше обсуждали возможность грязных чтений, поэтому я написал это для теста. если это условие никогда не выполняется, значит есть гарантия сериализации доступа для разных тредов/рутин на разных ядрах
Грязных чтений не будет. Но нет гарантий, что только что прочитанное значение актуальное.
вот, да, это я понял наконец-то) значит теоретически в примере выше результат инкремента может быть не тем, который ожидается при сериализации доступа, а значит когда-нибудь условие выполнится. знать бы, как это спровоцировать
более того, чтение начавшееся раньше может прочитать значение, записанное позже.
Я чёт не понял, когерентность кэшей же должна реализовываться процессором, вы пытаетесь поймать баг в цпу?
я пытаюсь понять, почему сами разрабы го не гарантируют отсутствие таких багов при использовании атомиков
Обсуждают сегодня