@gogolang

Страница 1555 из 1630
Алексей
14.10.2018
11:48:52
Ты не можешь обну ассемблерную команду нептомарно выполнить
И перед некоторыми x86 командами можно префикс lock ставить, что как-бы несколько намекает на то, что команды не особо атомарно выполняются.

Сергей
14.10.2018
11:54:21
И перед некоторыми x86 командами можно префикс lock ставить, что как-бы несколько намекает на то, что команды не особо атомарно выполняются.
Это не команда а префикс команды. И он для предотвращерия гонки состояний, а не для атомарности. Ты с двух поток атомарно заинкрементишь корректно, но логически неверно.

Алексей
14.10.2018
11:55:27
Ну inc по спеке атомарный
даже для значения в памяти?

Google
Сергей
14.10.2018
11:55:48
Да

Алексей
14.10.2018
11:56:02
хм

Это не команда а префикс команды. И он для предотвращерия гонки состояний, а не для атомарности. Ты с двух поток атомарно заинкрементишь корректно, но логически неверно.
Что значит корректно, но логически неверно? То что я инкрементом 5 получу 6, это понятно. А вот то, что я из нескольких потоков проинкрементирую 5 пару раз и могу получить 6 - это уже как-то не особо хорошо. Это имелось ввиду?

Сергей
14.10.2018
12:01:34
Ты инкрементишт регистр, причем конкурентно из нескольких потоков. Они заинкрементятся корректно, но может быть гонка данных. Если бы было не число, а структура, ты бы ее сделал некоррекьной без лока

Данные иногда бились

Евгений
14.10.2018
12:02:11
когда тебе нужно обработать все возможные кейсы или вывалиться в панику.
Скажем NullPointerException генерирует панику еще лучше )) Фишка в том, как без паник выдать правильный результат и не писать 100500 строк кода. Потому что на практике их никто не пишет. А Option[...] дает вариант удобно обрабатывать все нулевые значения не нагадив в код.

Сергей
14.10.2018
12:09:06
Я про память

Евгений
14.10.2018
12:10:03
отучаемся говорить за весь интернет
И заодно начинаем читать смайлы)) Кроме того, что понятие "дефолтный гошник" такое же абстрактное как "сферический конь" поэтому ни к кому конкретно относиться не может

Алексей
14.10.2018
12:10:11
Я про память
Тогда что значит "заинкрементятся корректно, но может быть гонка данных"? Как это понимать?

Сергей
14.10.2018
12:11:51
Заинкрементятся = данные не побьются. Со сложной структурой данные будут биться - часть полей будет из одного потока, часть из другого

Алексей
14.10.2018
12:15:46
Что значит данные не побьются? Если n потоков сделают обычный инкремент одного и того же значения памяти, может ли после этого оказаться в памяти число отличное от исходного + n?

Сергей
14.10.2018
12:18:56
Когда ты меняешь элементарную структуру, ты ее никогда не испортишь. Число останется числом. Может быть гонка, но данные будут кооректными. Сложную структуру можно наполовину одним потоком записать, наполовину другим. И это будет битая запись вообще

Google
Алексей
14.10.2018
12:20:04
Я что-то спрашивал про сложную структуру? То что число остаётся числом это и ежу понятно. Вопрос лишь в том, будет ли это корректное число?

Сергей
14.10.2018
12:21:20
Кароч почитай какую-нибудь книжку, статью про многопоточное прогрпммирование на си. Там все ньюнсы разжеваны

Алексей
14.10.2018
12:21:57
Просто инкремент значения в памяти - это чтение из памяти, сам инкремент, запись в память, то есть гипотетически это не атомарная операция, потому что другое ядро может между чтением и записью сделать своё чтение и запись и записать фактически неверное значение.

Кароч почитай какую-нибудь книжку, статью про многопоточное прогрпммирование на си. Там все ньюнсы разжеваны
Причём тут Си. Если я спрашиваю фактически про самый-самый низкий уровень? То что происходит в недрах процессора.

Alexander
14.10.2018
12:23:55
Нет, это одна операция и она атомарна
На уровне нескомпилированного кода x86

Сергей
14.10.2018
12:24:05
Просто переменная в твоем коде - уже нет

Алексей
14.10.2018
12:26:22
Именно ассемблерный inc
ассемблерный inc - это inc [eax] и атомарности то как раз тут и нет

потому что команда одна, а фактически операций сразу три

насколько я знаю, процессор не будет прерывать на середине выполнение команды inc [eax], но это не особо гарантирует её атомарность, потому что у нас скорее всего есть другие ядра или процессоры, которые могут выполнить свой inc [eax] одновременно для той же ячейки памяти

Zver
14.10.2018
12:31:52
потому что команда одна, а фактически операций сразу три
При чем тут операций фактически 3, процессор не на обум микрокод выполняет. Он его ранжирует, чтобы соблюсти целостность данных.

Алексей
14.10.2018
12:33:09
Alexander
14.10.2018
12:33:35
Мда, пздц, сколько же костылей надо поддерживать разработчикам x86 процессоров

Алексей
14.10.2018
12:34:28
На всех ядрах сразу? Ещё и для всех кэшей консистентность обеспечивает?
По моему процессор так не делает. Точнее он это сделает, если ему префикс lock указать. А в обычной ситуации как мне кажется он этого делать не будет.

Alexander
14.10.2018
12:36:16
> как мне кажется Ну это совсем несерьёзный подход, у набора команд есть спека, в которой либо определено это поведение, либо это является UB.

Zver
14.10.2018
12:36:31
На всех ядрах сразу? Ещё и для всех кэшей консистентность обеспечивает?
Не прав был, но если использовать lock, то атомарно выполнится.

Алексей
14.10.2018
12:36:48
Google
Alexander
14.10.2018
12:37:27
Тут костыли x86 как раз и не причём.
Тут не при чем, но в целом поддержка инструкций x86 требует кучи костылей.

Алексей
14.10.2018
12:39:18
> как мне кажется Ну это совсем несерьёзный подход, у набора команд есть спека, в которой либо определено это поведение, либо это является UB.
Ну вообще по хорошему да. Но мы все тут понимаем, что нам лень читать спеки. И можно в принципе логически (хотя в случае x86 логика не всегда применима) можно сообразить, что lock операции довольно медленные штуки, учитывая необходимость синхронизации состояний всех ядер процессора, а значит если бы любой инкремент в памяти был бы атомарным, то программы бы тормозили просто нещадно.

Да и само наличие явного lock префикса как бы намекает.

Zver
14.10.2018
12:41:10
В общем используйте атомики и спите спокойно. )

Nikolay
14.10.2018
12:43:34
В общем используйте атомики и спите спокойно. )
используйте sync.Pool и радуйтесь :)

Zver
14.10.2018
12:48:54
используйте sync.Pool и радуйтесь :)
Инкременты в туда пихать? ? Хм.

Nikolay
14.10.2018
12:49:11
Инкременты в туда пихать? ? Хм.
нет, инкременты можно в атомик

Zver
14.10.2018
12:50:26
Атомик в пул, пул в мютексы, а мютексы в уайтгруп. ?

Для надёжности.

Сергей
14.10.2018
12:51:10
Пишите однопоточный код и волосы будут послушными и шелковистыми

Алексей
14.10.2018
12:51:47
Maruf
14.10.2018
13:09:55
Всем привет! каким образом можно брать параметры query из url и формы без конфликтов r.URL.Query().Get("date") r.PostFormValue("date") проблема в том, что они перекрывают друг друга, хотя мне нужно брать один и тот же параметр или через url или форму, чтобы сделать запрос в БД

Kolunchik
14.10.2018
13:15:04
Видимо имеются в виду, что данные могут поступать через body или query (post/get)

Maruf
14.10.2018
13:15:32
да

верно

Savely
14.10.2018
13:16:30
ну а проверять просто и то и другое нельзя?

Maruf
14.10.2018
13:16:58
то есть не пойму как фронт прописать так, чтобы можно было параметры прописать в url а потом через r.URL.Query().Get("date") получить параметры

Savely
14.10.2018
13:17:34
эээ

Google
Savely
14.10.2018
13:17:56
всё ещё не могу понять в чем вопрос

передаем в URL, ну ок, передавайте

Vadim
14.10.2018
13:36:19
Кто знает каким образом так оптимизировали?

https://gist.github.com/311169ef04e27fe469ca91859af9cdff

Marlik
14.10.2018
14:14:41
Vadim
14.10.2018
14:15:15
Это бенч 1.0 го и 1.11.
Спасибо, кеп.

Marlik
14.10.2018
14:16:06
Поэтому ваш вопрос видимо к разрабам языка.

Roman
14.10.2018
14:18:43
Потому же почему нельзя было запилить сразу генерики или алгебраические типы — авторы языка слишком узколобы.
утверждать что авторы го не впилили в язык генерики потому-что "они на это не способны" это мягко говоря неправильно

Zver
14.10.2018
14:21:45
Что-то в последнее время тут спор не о чем.

Roman
14.10.2018
14:21:51
Да нет, правильно.
они впилили генерики, встроенные и интерфейсные посчитав что этого вполне достаточно для решения их задач (Go во первых они делали для себя и для Google). Это решение было осознанным и обоснованным (ради уменьшения сложности языка) хорошо ли это действительно или нет? это уже другой вопрос, на который у меня наверное только очень поверхностный ответ: я не знаю, ни в том, ни в обратном не уверен)) traits в Rust'е на самом деле выглядят очень интересно, гораздо лучше C++ шаблонов а от C++ генериков у меня жилудочное наружу просится

Алексей
14.10.2018
14:21:55
Они собственно сами утверждают, что дженерики как бы нужны вообще-то, но только непонятно как их реализовать так, чтобы и компилятор не тормозил и сгенерированный код тоже норм был

Алексей
14.10.2018
14:24:26
Сгенерированный код от синтаксической реализации особо не зависит.
Не в синтаксисе проблема, точнее не только в нём

Roman
14.10.2018
14:26:51
помню как-то в интервью Пайк сказал "зачастую в языке столько возможностей решения проблемы, что ты больше времени тратишь на размышление того какие инструменты применить, чем на написание кода. Go должен иметь только 1 путь решения проблемы для повышения продуктивности" и в этих словах есть смысл учитывая что Go разрабатывался скорее не как "general purpose programming language" а скорее как "cloud infrastructure and application programming language"

мне кажется проблема в том, что люди слишком сильно хотят видить Go именно как "gen. purpose programming lang.", хотя он изначально для этого не изобретался

Google
Roman
14.10.2018
14:28:12
вобщем - классика)

но и это желание вполне оправдано. Ведь Go показал что способен на большее чем просто серверный ПО клепать

Берёшь и не превращаешь, делов то.
как у вас на словах всё просто)) сделали бы уже форк языка, запилили свой proposal генериков, предложили бы pull, делов то))

Zver
14.10.2018
14:31:04
мне кажется проблема в том, что люди слишком сильно хотят видить Go именно как "gen. purpose programming lang.", хотя он изначально для этого не изобретался
Просто людям хочется иметь простой и достаточно универсальный язык. Go немного до этого не дотянул. Вот у людей от этого некоторое чувство неудовлетворенности.

SkyCoffee
14.10.2018
14:33:52
RefCell и прочие техники GC уже есть в Rust, наверняка какая-нибудь #(feature) появится для GC. Врядли гибкость, многообразие функций и ругательств компилятора появятся в Go

Zver
14.10.2018
14:34:18
по сути людям нужен некий Rust с GC ? щутка
Хотя я лично хотел бы язык с простым ООП, нравится мне оно. Но многие тут боятся ООП как огня.

SkyCoffee
14.10.2018
14:34:51
RefCell?
Box, RefCell... Там куча вариантов, я давно не ржавел)

Roman
14.10.2018
14:35:12
Хотя я лично хотел бы язык с простым ООП, нравится мне оно. Но многие тут боятся ООП как огня.
понятие ООП настолько размыто что люди сами не понимают чего боятся... боятся люди скорее наследования, а не OOP

Zver
14.10.2018
14:35:35
Мне нравится наследование. ?

Roman
14.10.2018
14:36:05
выстроить систему типов с наследованием, чтоб потом понять, что требования изменились и всё к чертям нужно валить и заново выстраивать с другой иерархией..

SkyCoffee
14.10.2018
14:36:06
ООП позволяет неограниченно глубокие древовидные наследования, это делает его потенциально сложным

Daniel
14.10.2018
14:36:38
Потенциально?

SkyCoffee
14.10.2018
14:37:01
Да, ведь можно обойтись без построения слишком глубоких наследований на практике

Daniel
14.10.2018
14:37:13
Не видал

Roman
14.10.2018
14:37:53
вот без encapsulation жить сложно, это значительная часть OOP, её бояться не стоит

Страница 1555 из 1630