Сап, хакеры. В общем, есть задача, на си с применением Linux api. Итак есть поток A ( producer ) и есть потоки T0...Tn ( consumers ), поток А подключается к серверу и читает какие-то данные с него, далее эти данные распределются между консумерами, которые делают какие-то вычисление с этими данными и должны обратно в этому же сокете отправить эти данные назад, но поток А должен постоянно следить за поступлением новых данных и все это через один сокет. Так вот как сделать так чтобы продюсер и консумеры читали и писали в один сокет одновременно без дата рэйсов и т.п? Есть какие то epoll() poll() но я че-то не особо понял как ими пользоваться... Кто может пояснить? Latency должно быть минимальное, то есть нельзя лочить и ждать пока один поток че-то запишет в сокет или другой прочитает.
>>874209 (OP)Что, неважно, в каком порядке отправят ответы producer-ы?
>>874209 (OP)data race тут не при чём. "При чём" тут может быть неатомарность записи в сокет.
>>874209 (OP)Запили вторую очередь, на запись.
>>874213Порядок не важен. Но если какой-то воркер отправляет что-то на сервер, сервер должен ответить подтверждением ( без соблюдения порядка ) которое должно обработаться в продюсере.>>874214Ну как раз неотомарность и дает дата рейс, который санитайзер показывает.
зачем такое в 2016 году делать на голых сокетах?ты тупой?
>>874216Ну я примерно сейчас так и сделал через очередь, но дело в том, что эту очередь надо разгребать. В общем, у меня сейчас на плюсах все через бусте ( старый код который надо переписать на си с нативными юникс сокетами ) и на чтение-запись стоять спинлоки. Чтение происходит без блокировок в цикле в интервалом в 10 мс проверяется наличие данных на в сокете на чтение, но все это работает как-то не правильно и не дает нужной производительности.
>>874224Затем, что нужна максимальная производительность.
>>874224Тем более приложение нацелено исключительно на линукс, нахуя городить какие-то монструозные обвязки. К тому же мне нужна независимость от libc++ которая не может быть статически слинкована. Этот бинарник должен запускаться без каких либо зависимостей на любой линукс системе.
epoll() есть. Не осилил - твои проблемы.
>>874226о_Оудачи
>>874220> Но если какой-то воркер отправляет что-то на сервер, сервер должен ответить подтверждением ( без соблюдения порядка ) которое должно обработаться в продюсере.В том же продюсере, что отправил ответ? А этот продюсер может чем-то заниматься, пока ответ не пришёл?
>>874209 (OP)Из сокета можно одновременно и читать и писать (фулл дуплекс, все дела)Тебе лишь нужно сделать последовательную запись в сокет для консюмеров ( через mutex, например)
>>874228> К тому же мне нужна независимость от libc++ которая не может быть статически слинкована.Почему не может?
>>874209 (OP)да будет респонсе кью и да поместят консумерытуда буфферы свои (как нон-локинг очередьсделать надеюсь знаешь). да будет продусерждать эвентов одновременно на сокете и очередии срать в сокет из очереди и консумеру в мейлбокс из сокета (когда соответствующие эвенты придут)
>>874278>>875020В общем, не спал 2 дня писал ебаные очереди, деревья, динамические массивы и т.п на ебаном си ибо там нихуя нету из коробки а сторонние либы нельзя юзать. Сделал 2 очереди на чтение и запись, создал NONBLOCK сокет, осилил epoll, слушаю эвенты EPOLLIN | EPOLLOUT | EPOLLERR | EPOLLRDHUP. Пока крутится в одном потоке все, далее планирую сделать main loop epoll в главном токе, а чтение и запись в отдельных, с мутексами на чтение или запись.
>>875195Взял бы asio и не мучался.
>>875195поздравляю, с изобретением ВЕЛОСИПЕДА.
>>875195Лучше бы заюзал libev/libuv