Size: a a a

2020 May 10

AS

Alexandr Sokolov in Go-go!
Владимир Столяров
Но в целом-то операция не атомарная выходит
А что есть атомарная операция?
источник

ВС

Владимир Столяров... in Go-go!
Ну, грубо говоря, выполняется все или ничего, никаким образом соседние потоки не могут в неё вклиниться
источник

zl

ziggy lucid in Go-go!
ziggy lucid
подскажите готовый хук для стандартного http-сервера, который считает статистику по соединениям - сколько открыто, сколько активно, сколько ожидает и тд
а на этот вопрос не подскажете, как правильно считать соединения и их состояния
там есть момент, то из Idle можно уйти в Closed или Active
выходит надо сохранять предыдущее состояние, чтобы корректно счетчики обновлять
может есть уже готовые решения?
источник

zl

ziggy lucid in Go-go!
в fasthttp на удивление все было проще
источник

AS

Alexandr Sokolov in Go-go!
Владимир Столяров
Ну, грубо говоря, выполняется все или ничего, никаким образом соседние потоки не могут в неё вклиниться
То решение, которое я предложил как раз подпадает под ваше определение
источник

zl

ziggy lucid in Go-go!
Alexandr Sokolov
Тогда есть такой ход

val := atomic.LoadUint64(vPtr)
for !atomic.CompareAndSwapUint64(vPtr, val, val - 1) {
   val = atomic.LoadUint64(vPtr)
}
не похоже на атомарность
сначала значение считывается и потом с ним что-то делается, а в момент после считывания и до делания может случиться что-угодно
источник

AS

Alexandr Sokolov in Go-go!
ziggy lucid
не похоже на атомарность
сначала значение считывается и потом с ним что-то делается, а в момент после считывания и до делания может случиться что-угодно
Вам очень сильно не хватает теории. Почитайте про lock free алгоритмы, в любой статейке что-то такое да будет
источник

zl

ziggy lucid in Go-go!
Alexandr Sokolov
Вам очень сильно не хватает теории. Почитайте про lock free алгоритмы, в любой статейке что-то такое да будет
т.е. между первой и второй строкой никто не может вклиниться и попортить картину?
источник

DP

Daniel Podolsky in Go-go!
ziggy lucid
т.е. между первой и второй строкой никто не может вклиниться и попортить картину?
может, но не с текущим набором инструкций
источник

DP

Daniel Podolsky in Go-go!
а с другим набором особенно и не гарантируешь ничего ни при каких условиях
источник

zl

ziggy lucid in Go-go!
Daniel Podolsky
может, но не с текущим набором инструкций
это что-то вроде недокументированных инструкций процессора, которые можно юзать на свой страх и риск?
источник

ВС

Владимир Столяров... in Go-go!
Alexandr Sokolov
То решение, которое я предложил как раз подпадает под ваше определение
ну как минимум race detector не поругался) правда вот зачем так сложно, если добавление uint64 max работает также
источник

AS

Alexandr Sokolov in Go-go!
ziggy lucid
т.е. между первой и второй строкой никто не может вклиниться и попортить картину?
Может. Для этого там и нужен цикл. Вся соль в операции atomic.CompareAndSwapUint64. Она устанавливает в первый параметр значение только если оно равно второму параметру и эта операция атомарна. Если проверка не удалась (кто-то другой поменял значение в переменной до нас), то функция вернет false, и тогда мы считаем актуальное значение переменной в нашу, и попробуем повторить декремент. И так до тех пор пока у нас не получится
источник

zl

ziggy lucid in Go-go!
ага, теперь понял
источник

zl

ziggy lucid in Go-go!
но сложновато несколько
atomic.AddUint64(&x, 0xFFFFFFFFFFFFFFFF) проще
источник

AS

Alexandr Sokolov in Go-go!
Владимир Столяров
ну как минимум race detector не поругался) правда вот зачем так сложно, если добавление uint64 max работает также
Это обобщенный подход к решению подобных проблем. Если честно, я не знал, что при добавлении max вы получите ожидаемый результат, выглядит как-то ненадежно)
источник

zl

ziggy lucid in Go-go!
Alexandr Sokolov
Это обобщенный подход к решению подобных проблем. Если честно, я не знал, что при добавлении max вы получите ожидаемый результат, выглядит как-то ненадежно)
валялкин использует, значит нормально
источник

AS

Alexandr Sokolov in Go-go!
ziggy lucid
валялкин использует, значит нормально
У него кстати докладик был «Грехи оптимизации» на прошлом гоферконе. Это к слову про «Значит нормально»)
источник

ВС

Владимир Столяров... in Go-go!
Alexandr Sokolov
Это обобщенный подход к решению подобных проблем. Если честно, я не знал, что при добавлении max вы получите ожидаемый результат, выглядит как-то ненадежно)
про то что переполнение integer приводит к неопределенному поведению, известно наверное любому, кто писал на C, а вот про беззнаковое подобного не припоминаю
источник

zl

ziggy lucid in Go-go!
Alexandr Sokolov
У него кстати докладик был «Грехи оптимизации» на прошлом гоферконе. Это к слову про «Значит нормально»)
в оптимизаторский ад попадет за грехи?
источник