Constantine
Aidar
Промисы и фьючерсы не про вызовы
Aidar
А просто про канал данных
Aidar
Это очередь на 1 элемент и не больше
Constantine
Это одноразовая очередь на 1 элемент
Constantine
Еще и с форсированным пуллом
Constantine
Форсированный пулл требует обработчика
Aidar
Кстати почему в плюсцах нет очереди на много элементов?
Aidar
Для таких целей
Aidar
В го вон есть
Aidar
В язык даже встроенно
Yaroslav
все есть, бери и пользуйся)
Aidar
Ога ща
Aidar
Локфри надо с нуля писать
Yaroslav
для локфри есть готовые реализации, того же гугла
Aidar
А блокировать всю очередь ради добавления это дичь
Aidar
Гранулярность надо как минимум уменьшать
Aidar
И это тоже приводит к тому что тебе нужно написать очередь снуля
Yaroslav
Yaroslav
а на чтение нет
Yaroslav
wat
Ildar
Да, давайте ещё Qt запихаем в плюсы, как раз не хватает
mefest
Ignat
Господин Саттер, залогиньтесь
Berkus
Aidar
Constantine
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
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
тут кто-то говорил про перформанс?
Berkus
Ignat
хз, говорят, кому-то гарантии важны сами по себе
Constantine
если задуматься, то гарантии тут одинаковые
Ignat
O RLY?
Constantine
да
Ignat
ну давай вызовем push
Aidar
так и надо
Можно с блокировками но мелкогранулярными
Ignat
и дешедульнем тред
Ignat
а потом из другого треда вызовем push
Ignat
какова Ваша оценка на время исполнения метода?
Constantine
ну давай тогда еще и другой тред дешедульнем
Aidar
Constantine
кажется, одно и то же получилось
Aidar
Мьютексы инвалидят кэш
Ignat
нет, его давай не будем дешедулить
Ignat
ну очевидно, что obstruction freedom никакого нет
Ignat
о каких гарантиях речь — непонятно
Constantine
у тебя нет никаких гарантий, если можно дешедулить треды
Constantine
тебе их дешедульнули все и всё
Constantine
ничего не происходит
Aidar
Мьютексы это неявная секвеншнал консистенс с инвалидацией всего кэша
Constantine
Aidar
Локфри да
Constantine
ладно, тогда напишем еще немного кода и сделаем some_weaker_mutex
Aidar
Как?
Constantine
смотри, принципиально lock free очередь будет, видимо, делать атомарное чтение и атомарный обмен
Constantine
давай заменим атомарное чтение на проверку блокировки с тем же memory order
Aidar
Копейр эксченджь наверн
Constantine
ну да
Constantine
давай те же атомарные операции проведем, только коллизию будем фор тех лулз выявлять еще на этапе чтения
Aidar
И чо?
Constantine
и вызывать таки wait
Aidar
У тебя в мьютекс 2 записи и одно чтение
Constantine
я тебе говорю, что принципиально вместо "поток будет делать мусорную операцию" я хочу "поток вызвал wait"
Aidar
На винде в юзерспейсе мьютексы?