170 похожих чатов

Извините, но ещё немного про атомики. я правильно понимаю, что

отсутствие гарантий сериализации доступа к переменной приведет к тому, что когда-то, теоретически, в данном коде сработает условие на 25 строке? https://goplay.space/#YOKs0MBPmYM Я запустил этот код локально, 50 тысяч горутин инкерементируют uint и проверяют значение, уже полчаса никаких сбоев. Значит, что тест неправильный или просто вероятность сбоя небольшая?

то есть всё, что мы можем сказать об атомиках - компилятор не сделает реордеринг и другие ядра не увидят промежуточных значений операции?

14 ответов

13 просмотров

Не означает не будет реордеринга. Просто к ячейке памяти будет эксклюзивный доступ при получении или зменении.

Vadim-Inshakov Автор вопроса
Vadim Inshakov
вы сейчас про мьютексы, кажется)

Мютекс позволяет эксклюзивно выполнять блок команд.

https://goplay.space/#dZKNQueqv7i Я чуть причесал ваш код. Условие никогда не сработает.

Внесите if atomic.LoadUint64(&ops) куда-нибудь сразу после atomic.AddUint64 и все заиграет новыми красками

Vadim-Inshakov Автор вопроса
Roman Timofeev
Внесите if atomic.LoadUint64(&ops) куда-нибудь сра...

нужно дождаться завершения работы всех рутин, раньше проверку вставлять нет смысла

Vadim-Inshakov Автор вопроса
Roman Timofeev
https://goplay.space/#dZKNQueqv7i Я чуть причесал...

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

Vadim Inshakov
мы просто выше обсуждали возможность грязных чтени...

Грязных чтений не будет. Но нет гарантий, что только что прочитанное значение актуальное.

Vadim-Inshakov Автор вопроса
Roman Timofeev
Грязных чтений не будет. Но нет гарантий, что толь...

вот, да, это я понял наконец-то) значит теоретически в примере выше результат инкремента может быть не тем, который ожидается при сериализации доступа, а значит когда-нибудь условие выполнится. знать бы, как это спровоцировать

Vadim Inshakov
мы просто выше обсуждали возможность грязных чтени...

более того, чтение начавшееся раньше может прочитать значение, записанное позже.

Vadim Inshakov
мы просто выше обсуждали возможность грязных чтени...

Я чёт не понял, когерентность кэшей же должна реализовываться процессором, вы пытаетесь поймать баг в цпу?

Vadim-Inshakov Автор вопроса
Aleksei Olshanskiy
Я чёт не понял, когерентность кэшей же должна реал...

я пытаюсь понять, почему сами разрабы го не гарантируют отсутствие таких багов при использовании атомиков

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта