Aidar
Промисы и фьючерсы не про вызовы
Aidar
А просто про канал данных
Aidar
Это очередь на 1 элемент и не больше
Constantine
Это одноразовая очередь на 1 элемент
Constantine
Еще и с форсированным пуллом
Constantine
Форсированный пулл требует обработчика
Aidar
Кстати почему в плюсцах нет очереди на много элементов?
Aidar
Для таких целей
Aidar
В го вон есть
Aidar
В язык даже встроенно
Yaroslav
все есть, бери и пользуйся)
Berkus
Кстати почему в плюсцах нет очереди на много элементов?
ну почему сразу нету, есть десятка три разной степени говнистости
Aidar
все есть, бери и пользуйся)
Она не предназначена для передачи в другой поток
Yaroslav
Она не предназначена для передачи в другой поток
Напиши свою обертку с мьютексами и будет предназначена
Aidar
Ога ща
Aidar
Локфри надо с нуля писать
Yaroslav
для локфри есть готовые реализации, того же гугла
Aidar
А блокировать всю очередь ради добавления это дичь
Aidar
Гранулярность надо как минимум уменьшать
Aidar
И это тоже приводит к тому что тебе нужно написать очередь снуля
Yaroslav
Yaroslav
а на чтение нет
Aidar
ты можешь блокировать на запись
Потребление из очереди это запись
Yaroslav
wat
Berkus
Локфри надо с нуля писать
не надо, их есть несколько годных
Aidar
не надо, их есть несколько годных
Разговор про плюсы а не реализации когото
Ildar
Да, давайте ещё Qt запихаем в плюсы, как раз не хватает
Ignat
Господин Саттер, залогиньтесь
Berkus
Разговор про плюсы а не реализации когото
https://github.com/cameron314/readerwriterqueue https://github.com/cameron314/concurrentqueue всё, вроде больше ничего не надо
Constantine
все эти ваши локфри полный мусор
Ignat
автор java.util.Vector, залогиньтесь
Constantine
https://github.com/cameron314/readerwriterqueue https://github.com/cameron314/concurrentqueue всё, вроде больше ничего не надо
The queue should only be used on platforms where aligned integer and pointer access is atomic; fortunately, that includes all modern processors (e.g. x86/x86-64, ARM, and PowerPC). Not for use with a DEC Alpha processor (which has very weak memory ordering) 😊 Note that it's only been tested on x86(-64); if someone has access to other processors I'd love to run some tests on anything that's not x86-based. Finally, I am not an expert. This is my first foray into lock-free programming, and though I'm confident in the code, it's possible that there are bugs despite the effort I put into designing and testing this data structure. Use this code at your own risk; in particular, lock-free programming is a patent minefield, and this code may very well violate a pending patent (I haven't looked). It's worth noting that I came up with this algorithm and implementation from scratch, independent of any existing lock-free queues.
Berkus
(You vow - we move)
Constantine
автор java.util.Vector, залогиньтесь
вот тебя моя lock free queue template <typename TMessage> class concurrent_message_queue final { public: static_assert(std::is_same<TMessage, std::decay_t<TMessage>>::value, "only decayed type assumed"); size_t push(TMessage&& message) { std::lock_guard<std::mutex> lock(m_mutex); m_queue.push_back(std::move(message)); return m_queue.size(); } std::vector<TMessage> pull() { std::vector<TMessage> result; { std::lock_guard<std::mutex> lock(m_mutex); std::swap(result, m_queue); } return result; } private: std::mutex m_mutex; std::vector<TMessage> m_queue; };
Ignat
почему сразу не wait free?
Constantine
я хочу стрессы, что работает быстрее
Ignat
тут кто-то говорил про перформанс?
Constantine
она не лок-фри
а ты наблюдательный)
Constantine
тут кто-то говорил про перформанс?
а какой профит от lock free кроме понтов, если не перформанс
Ignat
хз, говорят, кому-то гарантии важны сами по себе
Constantine
если задуматься, то гарантии тут одинаковые
Ignat
O RLY?
Constantine
да
Ignat
ну давай вызовем push
Aidar
так и надо
Можно с блокировками но мелкогранулярными
Ignat
и дешедульнем тред
Ignat
а потом из другого треда вызовем push
Ignat
какова Ваша оценка на время исполнения метода?
Constantine
ну давай тогда еще и другой тред дешедульнем
Aidar
а какой профит от lock free кроме понтов, если не перформанс
Ожидание обычно переходит в вызов ядра
Constantine
кажется, одно и то же получилось
Aidar
Мьютексы инвалидят кэш
Ignat
нет, его давай не будем дешедулить
Ignat
ну очевидно, что obstruction freedom никакого нет
Ignat
о каких гарантиях речь — непонятно
Constantine
у тебя нет никаких гарантий, если можно дешедулить треды
Constantine
тебе их дешедульнули все и всё
Constantine
ничего не происходит
Aidar
Мьютексы это неявная секвеншнал консистенс с инвалидацией всего кэша
Aidar
Локфри да
Constantine
ладно, тогда напишем еще немного кода и сделаем some_weaker_mutex
Aidar
Как?
Constantine
смотри, принципиально lock free очередь будет, видимо, делать атомарное чтение и атомарный обмен
Constantine
давай заменим атомарное чтение на проверку блокировки с тем же memory order
Aidar
Копейр эксченджь наверн
Constantine
ну да
Constantine
давай те же атомарные операции проведем, только коллизию будем фор тех лулз выявлять еще на этапе чтения
Aidar
И чо?
Constantine
и вызывать таки wait
Aidar
У тебя в мьютекс 2 записи и одно чтение
Constantine
я тебе говорю, что принципиально вместо "поток будет делать мусорную операцию" я хочу "поток вызвал wait"
Aidar
На винде в юзерспейсе мьютексы?