
Ievgenii
14.09.2018
06:34:41

NullSanya
14.09.2018
06:34:48
дело не в ссылке и расте, а в стеке)
Ну смотри, структура будет жива, пока выполнение не выйдет из функции, то есть если в конце функции поставить бесконечный цикл, то ссылка будет валидна

Ievgenii
14.09.2018
06:35:34
И тут ещё аспект, что при передаче через тот же ресив - там не копирование памяти, а наполнение каждого поля в отдельности, а это время

Google

Ievgenii
14.09.2018
06:36:13

NullSanya
14.09.2018
06:36:22

Ievgenii
14.09.2018
06:36:23
Вот когда работаете с тем же ЛибЕвентом, там нужно именно так делать

NullSanya
14.09.2018
06:37:29
Как?

Ievgenii
14.09.2018
06:37:30
Чтобы передать какой-то контекст
Создавать в куче
Ты к любому обработчику можешь присобачить void*
Что ты туда запихнешь - твое дело
Но это единственная возможность передачи контекста

Maxim
14.09.2018
06:39:02

Ievgenii
14.09.2018
06:39:34

Igor
14.09.2018
06:46:19
Контекст если он большой и уже выделен в куче конечно нет смысла копировать. А event который представляет из себя просто пару чисел и указатель - есть.

Google

Ievgenii
14.09.2018
07:11:18
Тут кто-то писал, что они на работе используют схему, когда Вася логика в либах. И есть какое-то приложение, которое подключает эти либы. Пишут на С#
Как вы осуществляете взаимодействие между либами и запуск каждой либы?

Igor
14.09.2018
07:35:48
Там не выйдет копировать)) Там же указатель передается
короче смысл вот в чем: если на каждую передачу между тредами что-то аллоцировать (под передачу не очень большой структуры) то это плохо - проще скопировать десяток байт. Аллоцирование тоже не магически бесплатное и стоит явно дороже копирования нескольких байт. С другой стороны если есть что-то уже аллоцированное то конечно его нужно передать указателем а не копированием.

Ievgenii
14.09.2018
09:13:13
И там я не хочу копировать, т.к. для копировании ещё и мьютексы нужны, чтобы быть уверенным, что все безопасно
Т.к. ты отправляешь, а когда оно прочитает его ты не знаешь, может у этому времени уже что-то поменяется

Toha
14.09.2018
09:15:36
Общение потоков основанное на сообщениях рулит

Ievgenii
14.09.2018
09:16:11

Toha
14.09.2018
09:17:49
Почему?
А как ты рабочие потоки сделаешь?

Igor
14.09.2018
09:45:07
Лично я предпочитаю алоцировать и передавать только адрес
Почему? Какие под этим соображения?
ой, ладно ) неважно

Toha
14.09.2018
09:48:16
Ну в твоем случае нужна какая то синхронизация, или не?
Хотя ты писал про мьютексы
А если адреса передавать через сообщения?

Ievgenii
14.09.2018
10:02:52
А как ты рабочие потоки сделаешь?
По факту я делаю мастер процесса и запускаю "воркеры", процессы, которые уже реализуют бизнес логику, зачастую столько, сколько ядер в системе

Toha
14.09.2018
10:03:19
а задания как им раздаешь?

Ievgenii
14.09.2018
10:03:32

Google

Ievgenii
14.09.2018
10:03:50
Все делают одно и тоже

Toha
14.09.2018
10:04:14
Блин. Я не представляю, как это работает)

Igor
14.09.2018
10:04:22

Ievgenii
14.09.2018
10:04:29
Как нджинкс работает?

Igor
14.09.2018
10:05:05
как ты думаешь, ты при этом много экономишь?
сколько данных при этом меняется в управлении кучей?

Ievgenii
14.09.2018
10:05:37

Igor
14.09.2018
10:05:39
а если её нужно увеличить?

Ievgenii
14.09.2018
10:06:02

Igor
14.09.2018
10:06:16
арену кучи

Ievgenii
14.09.2018
10:06:27

Igor
14.09.2018
10:06:49
ну заполнилась вся, нужно добавить места
просто тебе не нужно передавать сложные структуры в воркеры - если это просто принятое соединение то просто передай номер сокеты

Ievgenii
14.09.2018
10:08:10

Igor
14.09.2018
10:08:10
или номер вместе с какими-то доп полями

Ievgenii
14.09.2018
10:09:17
Я не использую сенд и ресив, они блокирующие. Я делал кастомное. То мне гораздо проще было передавать всегда только адрес

Igor
14.09.2018
10:09:51
ну ок, я не знаю в деталях твоего случая, поэтому не могу спорить
но это однозначно не единственно возможный подход к проблеме

Google

Ievgenii
14.09.2018
10:11:47

Igor
14.09.2018
10:12:02
?

Ievgenii
14.09.2018
10:18:45
Или они не самодостаточные и это просто набор функций?

Pavel
14.09.2018
11:11:09
С указательной семантикой сразу встает вопрос сборки мусора, null safety и со всем этим как-то надо бороться. Разработчики языка уже попытались ответить на вопрос "ну зачем пытаться копировать", создав GC и подобосрались :D


Dmitry
14.09.2018
11:34:45
Но персистентные структуры данных эффективны именно с указательной семантикой, когда изменение списка или дерева означает создание одной или нескольких нод, с шэрингом большей части данных. Т.е. весь список или все дерево не надо копировать на каждый чих.

Pavel
14.09.2018
11:35:33
В общем сегодня утром я осмыслил что вчера было сказано и пришел к выводу что все надо переделать
иммутабельность через immutable слишком низкоуровневая чтобы язык мог с ней работать. Надо сделать иммутабельность через приватные поля, а наружу выставить геттеры.

Admin
ERROR: S client not available

Pavel
14.09.2018
11:37:07
А вместо структуры событие будет представляться shared классом, благодаря чему возможны все фокусы с ООП - полиморфизм, наследование, интерфейсы и т.д.
объект будет создаваться один раз, будет разделен между всеми тредами, никаких указателей, а когда все плагины обработают его то встроенный GC подчистит. Никаких указателей, удобная ссылочная семантика. Пока проблему производительности и stop-the-world не буду решать, а в дальнейшем если она появится то как-нибудь заменю new MyClass на пул объектов.

Igor
14.09.2018
11:39:48
а что у тебя входит в структуру события?
что ты передаёшь в другие треды?

Pavel
14.09.2018
11:40:24
Task в котором возникло событие, адрес отправителя, адрес кому отправлено и текст сообщения

Igor
14.09.2018
11:40:52
ага
я так понимаю - тем или иным образом у тебя всё что ты отправляешь плагинам приходит из сети?

Pavel
14.09.2018
11:41:57
В дальнейшем будет все сложно, например если ловить событие от телеграма, то это может быть и картинка и видео, и цитата сообщения, и информация о том что человек пришел в чат. А если реализовывать jabber протокол то там вообще куча всяких вариантов, кто кому откуда написал и с какого сервера.

Google

Pavel
14.09.2018
11:42:04

Igor
14.09.2018
11:42:11
ты потом в основном треде думаешь как-то обогащать эти данные и их уже передавать
а ты передавай простые данные принятые из сети, а всё это обогащение отложи уже в воркеры
тебе тогда не нужно будет заморачиваться со всей этой фигней

Pavel
14.09.2018
11:43:08
Ну у меня по сути воркер сейчас и ловит сообщения

Igor
14.09.2018
11:43:44
нв не воркер, я имел ввиду - плагин или что там у тебя в другом треде

Pavel
14.09.2018
11:43:50
Он делает long poll HTTP запрос, как только данные пришли то начинает создавать структуры и эти структуры рассовывать в очереди плагинов на обработку.

Igor
14.09.2018
11:43:59
вот
передай не созданные структуры с наворотами

Pavel
14.09.2018
11:44:19
Плагин универсальный, ему пришло текстовое сообщение он должен ответить. Причем он не должен знать, через telegram оно пришло, через slack или через icq

Igor
14.09.2018
11:45:49
создай тонкую прослойку между твоим кодом и плагином. она принимает от другого треда json, создаёт структуру, отдаёт её плагину

Pavel
14.09.2018
11:46:37
Но зачем? Мой код и есть прослойка
То есть структурно конечно можно это дело выделить в какую-нибудь фабрику событий

Igor
14.09.2018
11:48:38
плагин сам слушает на receive из другого треда?

Pavel
14.09.2018
11:49:25
да

Toha
14.09.2018
11:51:04
Еще один мессенджер на ди??

Igor
14.09.2018
11:52:14
вот здесь вставь прослойку. пусть слушает твой код. получает json или картинку, которые есть просто указателина неизменяемые данные, создаёт из этого структуру. Правда если это дорогая обработка, то получается дублирование.
зато нет синхронизации

Pavel
14.09.2018
11:55:13
Плагин не должен заниматься созданием структуры из json, это нарушение single responsibility
Он принимает какое-то абстрактное событие, причем даже не должен знать по какому проткоолу оно пришло.

Igor
14.09.2018
11:56:23
вот здесь вставь прослойку. пусть слушает твой код. - получает событие и обрабатывает его твой код в получившем треде и уже потом вызывает плагин

Toha
14.09.2018
11:56:33
Solid - это миф)