@ProCxx

Страница 1119 из 2477
Anatoly
21.07.2017
15:37:58
надо мерять

Alexander
21.07.2017
15:38:10
надо мерять
абсолютно согласен

Berkus
21.07.2017
15:42:11
в общем случае lock-free будут медленнее в случае contention

это ж не бесплатно

Google
Berkus
21.07.2017
15:43:33
Ruslan
21.07.2017
15:44:53
спасибо всем)

cyberzx
21.07.2017
15:48:03
ну пусть выбирает мб lock-free контейнеры
lock-free синхронизация в общем случае медленее, чем locking

Antony
21.07.2017
15:51:06
да, со стандартными контейнерами беда насчет локов. надо делать свои таблички, мапы и тд, которые влезают в кеш-линию
Это вообще не так работает, как вы думаете. Если что-то помещается в кеш линию, но работаете вы с этим не через атомарные операции - у вас ошибка в коде. Именно ошибка! И да, при работе приложения это проявится P.S.: Я стёр 7 предыдущих своих ответов, 5 из которых были матерные

cyberzx
21.07.2017
15:51:24
lock-free это не про скорость. lock-free это про гарантии

Arseny
21.07.2017
15:52:02
Что принято использовать если нужен семафор, которого можно ждать в epoll/poll/select? Я пока умею только писать свою реализацию через eventfd.

cyberzx
21.07.2017
15:52:47
а чем eventfd не устраивает?

я тоже его использую для этих целей

Arseny
21.07.2017
15:55:24
Так не хочется свой семафор писать. И совсем не хочется в fast path пользоваться eventfd. То есть хочется пользоваться eventfd только если действительно нужно ждать.

Вообще в результате нужна MPSC очередь, которую можно добавить в epoll И это как будто совершенно не распространенная структура данных.

Antony
21.07.2017
16:01:43
Вообще в результате нужна MPSC очередь, которую можно добавить в epoll И это как будто совершенно не распространенная структура данных.
Делал подобное на Boost.Asio. Для этого заводил атомарную переменную под флаг, который использовался для проверки события. Каждый кто с флагом работал, при изменения/чтении смотрел, надо ли запускать подзадачу. Есть немного кода вот тут http://apolukhin.github.io/Boost-Cookbook/second_edition.html#Chapter06-recipe6-part1 но боюсь без обяснений он не очень поможет.

Сейчас попробую по быстрому рассказать идею: ` void set_new_value(T value) { static std::atomic i = 120; if (i.swap(value) == required_value) { io_service_instance.post(task_that_must_be_executed_on_condition); } }

Google
Владислав
21.07.2017
16:06:16
Ребята, такой вопрос. Есть приложуха, которая берёт инфу с N mysql серверов (в среднем на каждом сервере несколько миллионов записей в бд), копирует данные в целевую БД, заполняет дополнительные таблицы на основе этих данных. Задачи такие: 1) выполнить копирование и перехуячиывание данных в адекватное время 2) поддерживать актуальность данных, т.е если на одной из сорс БД какая-то запись {удалилилась, обновилась, добавилась}, то она должна {удалиться, обновиться, добавиться} и на таргет БД. Я уверен, что это достаточно распостранённая задача. Как её решать, куда думать, какие есть паттерны?

Alexander
21.07.2017
16:15:31
Дед Пегас
21.07.2017
16:19:10
Надо купить и залить в интернеты.

кекекек

Alexander
21.07.2017
16:19:44
а мне не хочется покупать ?

Antony
21.07.2017
16:20:10
первое издание пиратится спокойно по 3-5 ссылке в гугле Второе издание пока что не нашёл, где спиратить - жду
Еще не вышло :) Сейчас второе чтение - надо исправить недочёты, найденные ревьюерами.

Дед Пегас
21.07.2017
16:21:02
а, вот оно что. Будем ждать ?
Надо как Ъ пираты спиратить до выхода!

Alexander
21.07.2017
16:21:15
Pavel
21.07.2017
16:21:27
Дед Пегас
21.07.2017
16:21:27
?

Alexander
21.07.2017
16:25:50
а зачем ждешь? :)
чтобы спиратить и почитать. Годная книга же

Antony
21.07.2017
16:27:33
Там кстати Glen Fernandes годные замечания сыпет :)

Stanislav
21.07.2017
16:28:12
Arseny
21.07.2017
16:33:49
В общем один из поиковиков выдаёт ссылку прям на книгу в pdf формате. Там можно прочесть нужную главу с объяснениями. Но не уверен что такой подход на 100% вам подойдёт
Вроде по коду более-менее понятно что происходит. Но у меня несколько другого плана проблема. Есть тьма реализаций разнообразных concurrent queue, но я не видел ни одной, которую можно добавить в poll. Что-то похожее наверняка есть во внутренностях всяких asio и libev, но самостоятельных реализаций я не видел и не очень понимаю почему.

Хотя видел, например, такое: https://github.com/facebook/folly/blob/master/folly/io/async/NotificationQueue.h

Arseny
21.07.2017
16:44:14
Дорого. std::conditional_variable работает как правило быстрее, чем epoll+что-то ещё
А какая альтернатива если нужно общаться с потоком в котором epoll крутится?

Google
Antony
21.07.2017
16:44:59
таймеры?

расскажите поподробнее про проблему

постараюсь через пару часов ответить :)

Andrei
21.07.2017
17:19:42
А какая альтернатива если нужно общаться с потоком в котором epoll крутится?
Блокироваться на epoll-е, но сперва заводить таймер. Если из epoll_wait вышли с дескриптором таймера — опрашиваем какой-нибудь blocking_queue на том же СV.

Либо если не хочется таймер — пошарить между потоками дескриптор и из продьюсера при записи чего-нибудь в очередь пробуждать epoll по этом дескриптору.

eventfd например.

Arseny
21.07.2017
17:28:29
Либо если не хочется таймер — пошарить между потоками дескриптор и из продьюсера при записи чего-нибудь в очередь пробуждать epoll по этом дескриптору.
Не хочется так часто будить поток просто так. Да, это как раз через eventfd сейчас и реализовано. Но не хочется и не нужно писать что-то в eventfd на каждое добавление в очередь. В оптимальном случае, когда оба потока достаточно загружены в очереди всегда что-то есть и eventfd вообще не должен использоваться. Как и нормальный семафор, который если не нужно ждать просто одну переменную атомарно меняет и не вызывает системные функции.

Azoyan
21.07.2017
17:33:02
Парни, а серваки на gpu есть?

Evgeniy
21.07.2017
17:33:18
Azoyan
21.07.2017
17:33:37
Ну коннекты обрабатывать гпц

cyberzx
21.07.2017
17:34:20
а смысл?

и что ты имеешь в виду под обработкой коннектов? парсинг пакетов?

Azoyan
21.07.2017
17:34:45
Не знаю

Ну да

Я просто спросил

cyberzx
21.07.2017
17:35:16
CPU с этим справляется вполне хорошо

Azoyan
21.07.2017
17:35:22
Ну ок

Andrei
21.07.2017
17:35:30
@arseny Вернее я имел в виду, в чём проблема с eventfd? Мы обработали из epoll-а весь io, и прежде чем уснуть проверили очередь, и только если там пусто, пошли в epoll_wait, затем первый же продьюсер, который обнаружил, что очередь пустая, зафайрил eventfd

Mikhail
21.07.2017
17:35:33
Парни, а серваки на gpu есть?
ты имеешь с виду графические станции?

Azoyan
21.07.2017
17:35:55
Не, вэб север

Google
Andrei
21.07.2017
17:36:11
Если продьюсеры заполняют очередь со скоростью потребления консьюмером, то мы и спать-то собсна на epoll-е не будем.

Дед Пегас
21.07.2017
17:36:12
У гпу нет доступа до туда.

На этом всё.

Andrei
21.07.2017
17:37:27
Можно еще сигнал послать :) Это тоже epoll прервёт.

И что в этом плохого? Зачем обязательно спать на поллинге?
Спать на поллинге — это хорошо. Но вопрос был в том, как лишний раз write не делать в eventfd

Admin
ERROR: S client not available

cyberzx
21.07.2017
17:38:49
У гпу нет доступа до туда.
Ну можно делать на GPU дешифрацию трафика, например. Но это не нужно и на CPU вполне быстро

Andrei
21.07.2017
17:38:54
Я вот ничего плохого в записи в eventfd не вижу. Один фиг консьюмера КАК-ТО надо разбудить.

Andrei
21.07.2017
17:40:13
Особенно, если epoll в ET режиме.

cyberzx
21.07.2017
17:40:25
тебе просто хочется пообщаться?
Нет. Терпеть не могу общаться. Я чёртов социофоб

Дед Пегас
21.07.2017
17:40:58
фаще это оффтоп

Хороший, сознательный гражданин!

Arseny
21.07.2017
17:47:42
Если продьюсеры заполняют очередь со скоростью потребления консьюмером, то мы и спать-то собсна на epoll-е не будем.
Ну так да. Если хочется делать write только тогда когда консьюмер действительно ждет, то получается что-то вроде семафора, но внутри не futex, а eventfd. Меня удивляет, что такой абстракции в библиотеках обычно нет. Более того, если речь идет о крутой mpsc queue, то интуитивно кажется, что защищать ее снаружи семафором (на futex или eventfd) = терять большую часть ее крутости. Эффективнее должно быть как-то встроить eventfd внутрь очереди. Таких очередей тоже как будто нету.

Andrei
21.07.2017
17:48:39
А, стоп, там снаружи локфри mpsc?

Тогда грустно довольно, не уверен, что это вообще принципиально возможно скрестить без потерь с epoll-ом.

Arseny
21.07.2017
18:12:17
расскажите поподробнее про проблему
Опишу еще раз всю ситуацию TLDR Откуда брать mpsc queue, которую можно ждать в epoll или почему таких нигде нету? Есть несколько потоков, в каждом из них крутится epoll. Потокам нужно слать друг другу сообщения. Когда потоку приходит сообщение он должен пробуждаться из epoll-а. Разбудить поток можно разными способами: eventfd, pthread_signal, pipe наконец. Пробуждаться каждые x миллисекунд и проверять очередь так себе вариант. Как именно будить имхо не очень важно, системный вызов и пробуждение потока это уже относительно долго. Но допустим используется eventfd, как будто созданный именно для этого. Для отправки сообщений хочется использовать mpsc queue. При этом ее нужно как-то скрестить с eventfd, чтобы fast path в eventfd не писал вообще. То есть хочется хочет делать write в eventfd только когда consumer действительно спит в epoll. Это можно сделать обернув очередь в семафор внутри которого не futex, а eventfd. Но нигде не видел реализации такого семафора. Более того интуитивно кажется что оборачивать очередь в семафор не оптимально, оптимальней встроить eventfd в саму очередь. Но таких очередей тоже что-то не видно.

Alexander
21.07.2017
18:15:45
у кого-нибудь на работе стояла задача из разряда "Найти дистанцию редактирования между двумя последовательностями" ?

Google
Alexander
21.07.2017
18:16:38
или просто найти расстояние между двумя последовательностями?

Arseny
21.07.2017
18:18:32
Тогда грустно довольно, не уверен, что это вообще принципиально возможно скрестить без потерь с epoll-ом.
lockfree spsc queue я как-то с eventfd скрестил, вроде сносно вышло. Интересно чужие реализации посмотреть, но где они?

Berkus
21.07.2017
18:19:18
любой дифф возьми - это оно

или OT

Alexander
21.07.2017
18:19:41
levenshtein?
и он тоже

Именно по работе?
не только прод - домашние задачи тоже считаются

Killua
21.07.2017
18:20:13
Извраты собеседований, не?

Alexander
21.07.2017
18:20:28
Killua
21.07.2017
18:20:43
Потому что давно всё написано.

Arseny
21.07.2017
18:20:48
не только прод - домашние задачи тоже считаются
Я как-то вот это реализовывал http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.11.3463

Andre
21.07.2017
18:20:50
классическая задача по ДП, извратиться там можно вопросами "а как уменьшить память?"

Alexander
21.07.2017
18:21:19
Killua
21.07.2017
18:21:47
В гугле, разумеется.

Alexander
21.07.2017
18:22:38
В гугле, разумеется.
а я думал, ты кинешь мне ссылку из стандартной крестовой либы

Страница 1119 из 2477