[Ответить в тред] Ответить в тред

02/12/16 - Конкурс визуальных новелл доски /ruvn/
15/11/16 - **НОВЫЙ ФУНКЦИОНАЛ** - Стикеры
09/10/16 - Открыта доска /int/ - International, давайте расскажем о ней!



Новые доски: /2d/ - Аниме/Беседка • /wwe/ - WorldWide Wrestling Universe • /ch/ - Чатики и конфочки • /int/ - International • /ruvn/ - Российские визуальные новеллы • /math/ - Математика • Создай свою

[Назад][Обновить тред][Вниз][Каталог] [ Автообновление ] 18 | 1 | 9
Назад Вниз Каталог Обновить

Linux socket simultaneous read write Аноним 11/11/16 Птн 22:22:47  874209  
41Ux80gDE1L.SX2[...].jpg (14Кб, 260x341)
Сап, хакеры. В общем, есть задача, на си с применением Linux api. Итак есть поток A ( producer ) и есть потоки T0...Tn ( consumers ), поток А подключается к серверу и читает какие-то данные с него, далее эти данные распределются между консумерами, которые делают какие-то вычисление с этими данными и должны обратно в этому же сокете отправить эти данные назад, но поток А должен постоянно следить за поступлением новых данных и все это через один сокет. Так вот как сделать так чтобы продюсер и консумеры читали и писали в один сокет одновременно без дата рэйсов и т.п? Есть какие то epoll() poll() но я че-то не особо понял как ими пользоваться... Кто может пояснить? Latency должно быть минимальное, то есть нельзя лочить и ждать пока один поток че-то запишет в сокет или другой прочитает.
Аноним 11/11/16 Птн 22:29:37  874213
>>874209 (OP)
Что, неважно, в каком порядке отправят ответы producer-ы?
Аноним 11/11/16 Птн 22:32:24  874214
>>874209 (OP)
data race тут не при чём. "При чём" тут может быть неатомарность записи в сокет.
Аноним 11/11/16 Птн 22:33:00  874216
>>874209 (OP)
Запили вторую очередь, на запись.
Аноним 11/11/16 Птн 22:35:49  874220
>>874213
Порядок не важен. Но если какой-то воркер отправляет что-то на сервер, сервер должен ответить подтверждением ( без соблюдения порядка ) которое должно обработаться в продюсере.
>>874214
Ну как раз неотомарность и дает дата рейс, который санитайзер показывает.
Аноним 11/11/16 Птн 22:40:00  874224
зачем такое в 2016 году делать на голых сокетах?
ты тупой?
Аноним 11/11/16 Птн 22:40:29  874225
>>874216
Ну я примерно сейчас так и сделал через очередь, но дело в том, что эту очередь надо разгребать. В общем, у меня сейчас на плюсах все через бусте ( старый код который надо переписать на си с нативными юникс сокетами ) и на чтение-запись стоять спинлоки. Чтение происходит без блокировок в цикле в интервалом в 10 мс проверяется наличие данных на в сокете на чтение, но все это работает как-то не правильно и не дает нужной производительности.
Аноним 11/11/16 Птн 22:41:26  874226
>>874224
Затем, что нужна максимальная производительность.
Аноним 11/11/16 Птн 22:43:40  874228
>>874224
Тем более приложение нацелено исключительно на линукс, нахуя городить какие-то монструозные обвязки. К тому же мне нужна независимость от libc++ которая не может быть статически слинкована. Этот бинарник должен запускаться без каких либо зависимостей на любой линукс системе.
Аноним 11/11/16 Птн 23:45:30  874247
epoll() есть. Не осилил - твои проблемы.
Аноним 12/11/16 Суб 00:32:44  874265
>>874226
о_О
удачи
Аноним 12/11/16 Суб 01:00:58  874275
>>874220
> Но если какой-то воркер отправляет что-то на сервер, сервер должен ответить подтверждением ( без соблюдения порядка ) которое должно обработаться в продюсере.
В том же продюсере, что отправил ответ? А этот продюсер может чем-то заниматься, пока ответ не пришёл?
Аноним 12/11/16 Суб 01:23:55  874278
>>874209 (OP)
Из сокета можно одновременно и читать и писать (фулл дуплекс, все дела)
Тебе лишь нужно сделать последовательную запись в сокет для консюмеров ( через mutex, например)
Аноним 13/11/16 Вск 03:47:01  874991
>>874228
> К тому же мне нужна независимость от libc++ которая не может быть статически слинкована.
Почему не может?
Аноним 13/11/16 Вск 08:57:12  875020
>>874209 (OP)
да будет респонсе кью и да поместят консумеры
туда буфферы свои (как нон-локинг очередь
сделать надеюсь знаешь). да будет продусер
ждать эвентов одновременно на сокете и очереди
и срать в сокет из очереди и консумеру в мейлбокс из сокета (когда соответствующие эвенты придут)
Аноним # OP  13/11/16 Вск 18:16:18  875195
>>874278
>>875020
В общем, не спал 2 дня писал ебаные очереди, деревья, динамические массивы и т.п на ебаном си ибо там нихуя нету из коробки а сторонние либы нельзя юзать. Сделал 2 очереди на чтение и запись, создал NONBLOCK сокет, осилил epoll, слушаю эвенты EPOLLIN | EPOLLOUT | EPOLLERR | EPOLLRDHUP. Пока крутится в одном потоке все, далее планирую сделать main loop epoll в главном токе, а чтение и запись в отдельных, с мутексами на чтение или запись.
Аноним 13/11/16 Вск 19:49:36  875223
>>875195
Взял бы asio и не мучался.
Аноним 14/11/16 Пнд 00:02:38  875326
>>875195

поздравляю, с изобретением ВЕЛОСИПЕДА.
Аноним 14/11/16 Пнд 00:20:18  875332
>>875195
Лучше бы заюзал libev/libuv

[Назад][Обновить тред][Вверх][Каталог] [Реквест разбана] [Подписаться на тред] [ ] 18 | 1 | 9
Назад Вверх Каталог Обновить

Топ тредов
Избранное