
Alexander
14.10.2018
10:55:31
Не шутите так
А я не шучу. В клиентском коде дженерики по большей части не нужны, зато необходимы в библиотеках.

SkyCoffee
14.10.2018
10:56:37

Alexander
14.10.2018
10:57:20

Google

xPushkin
14.10.2018
10:57:40

Алексей
14.10.2018
10:57:48
Go программисты почему-то говорят так, будто в go вообще нет задач для гегериков, вот только они есть и даже решаются. Вот только решаются они просто суперкостыльно.

xPushkin
14.10.2018
10:57:50

Alexander
14.10.2018
10:58:34
Какие же сложности?
Ну напишите какой нибудь циклический граф на расте, поймёте что за сложности.

SkyCoffee
14.10.2018
10:58:59

Alexander
14.10.2018
11:00:21

Artem
14.10.2018
11:01:07

SkyCoffee
14.10.2018
11:01:18

Alexander
14.10.2018
11:01:36

Алексей
14.10.2018
11:02:18

SkyCoffee
14.10.2018
11:03:15

Alexander
14.10.2018
11:03:16

Daniel
14.10.2018
11:03:37
О_о

Google

SkyCoffee
14.10.2018
11:03:55

Алексей
14.10.2018
11:04:18

Pawel
14.10.2018
11:05:03
глупый вопрос
var a int
go func() {
for range time.Tick(time.Millisecond) {
a++
}
}()
go func() {
fmt.Println(a)
time.Sleep(time.Second)
}()
это ж будет неопределённое поведение и data race?

Alexander
14.10.2018
11:05:17

SkyCoffee
14.10.2018
11:06:27

Pawel
14.10.2018
11:09:52

SkyCoffee
14.10.2018
11:10:25
Сам принцип правильный, но работает он не обязательно везде

Alexander
14.10.2018
11:10:30

SkyCoffee
14.10.2018
11:11:45
Есть базы данных с принципом один писатель - много читателей, там этот принцип работает прекрасно

Pawel
14.10.2018
11:12:13

Alexander
14.10.2018
11:12:57
Либо транзакции.

Алексей
14.10.2018
11:14:07

Pawel
14.10.2018
11:15:01
байт не до конца запишет??

xPushkin
14.10.2018
11:15:37

SkyCoffee
14.10.2018
11:15:41
int бывает больше байта
вообще именно int может и прокатит, его трудно не до конца переписать, но со всякими структурами точно бывает неполная дозаписанность

Алексей
14.10.2018
11:16:09
в случае какого-нибудь инкремента числа - скорее всего всё будет норм, но для более сложных стркутур всё будет очень плохо

Alexander
14.10.2018
11:16:55

Google

Pawel
14.10.2018
11:17:05
я и для интов юзаю atomic от греха по дальше

Алексей
14.10.2018
11:17:10
вот много читателей вполне могут читать без блокировок, когда писатель ничего не пишет

Alexander
14.10.2018
11:18:31

Алексей
14.10.2018
11:18:47

Volodymyr
14.10.2018
11:21:35
когда то препод в универе по сишке говорил, что блокировки нужны только на запись, а на чтения не нужны.
в го лучше всегда использовать мютекс?

Sergey
14.10.2018
11:21:58
вы тут переизобретаете RWLock что ли? (котоpый RwMutex в го)

Алексей
14.10.2018
11:23:51

SkyCoffee
14.10.2018
11:23:52
в го лучше всегда использовать мютекс?
если переменная используется из разных одновременно работающих горутин и не константа, то mutex было бы неплохо. Чтоб при случайном забывании, что в переменную нельзя писать, ничего плохого не случилось

Alexander
14.10.2018
11:24:08

Sergey
14.10.2018
11:24:24

Alexander
14.10.2018
11:24:32

Zver
14.10.2018
11:26:12

Алексей
14.10.2018
11:26:45
лок фри это какое-то слишком сильное колдунство

Alexander
14.10.2018
11:28:01

Pawel
14.10.2018
11:28:45

Volodymyr
14.10.2018
11:30:48
наверно в одноядерных системах на int не нужен мютекс.

Zver
14.10.2018
11:31:14

Алексей
14.10.2018
11:31:36

Alexander
14.10.2018
11:32:17

Google

Zver
14.10.2018
11:32:23
Единственное, может это не для всех видов процессоров выполнимо.

Алексей
14.10.2018
11:32:46

Volodymyr
14.10.2018
11:32:58
то есть мы пришли к выводу, что атомик или более сложный мютекс нужен всегда на чтения (даже для int-а) ?

Zver
14.10.2018
11:33:04
Тот же инкремент int64 на 32х разрядном атомарно не выполнить.

Alexander
14.10.2018
11:33:50
Насколько я помню никаких локов операции записи в оперативную память не содержат. А значит на многоядерных системах это гонка.

Алексей
14.10.2018
11:34:43
Просто инкремент значения - это чтение из памяти в регистр, инкремент регистра, запись обратно в память. В x86/x64 это одна комманда вида inc [eax], но насколько атомарно выполняет её сам процессор - это большой вопрос. Плюс ещё как кеши между ядрами синхронизируются.
так что я бы не стал так сильно утверждать что, инкремент на 100% безопасен и атомарен

Zver
14.10.2018
11:35:51

Алексей
14.10.2018
11:36:27
Так что можно сказать, что для всего обязательно, чтобы где-нибудь конфуза не вышло.

Alexander
14.10.2018
11:36:52

Сергей
14.10.2018
11:37:20

Алексей
14.10.2018
11:37:47

Сергей
14.10.2018
11:38:21

Zver
14.10.2018
11:38:26
Интеловские могут вроде бы и памяти инкрементить без загрузки в регистры.

Алексей
14.10.2018
11:38:34

Сергей
14.10.2018
11:38:54

Алексей
14.10.2018
11:39:14
Вы вообще в курсе, что машинные комманды и то что реально выполняет процессор - это не всегда одно и тоже?

Google

Alexander
14.10.2018
11:40:00

Сергей
14.10.2018
11:40:08

Алексей
14.10.2018
11:40:28

Сергей
14.10.2018
11:41:13

Алексей
14.10.2018
11:41:24

Сергей
14.10.2018
11:41:33
Инкремент

Алексей
14.10.2018
11:41:49
вот inc eax скорее всего атомарный
а другая команда inc [eax] уже может быть как-то не очень атомарной

Сергей
14.10.2018
11:42:53
Ты тролль чтоль?

Алексей
14.10.2018
11:43:04
нет. я серьёзно спрашиваю

Сергей
14.10.2018
11:43:12
Ты не можешь обну ассемблерную команду нептомарно выполнить

Алексей
14.10.2018
11:43:12
это разные команды

Сергей
14.10.2018
11:43:15
Никак
Я понимаю, что разные

Алексей
14.10.2018
11:43:27

Alexander
14.10.2018
11:43:45
Можно ещё вспомнить, что существуют ещё архитектуры кроме древнего x86

Алексей
14.10.2018
11:45:21
Можно начать с того, что ассемблерная команда/команда машинного кода - это уже некая абстракция, потому что к примеру есть тот же кэш, который никак не отражён в этих командах. Есть конвеер, который сразу кучу команд читает и проводит всякие оптимизации.