Мы пытались использовать в нашем коде очередь без блокировок, чтобы уменьшить конфликт блокировок между одним производителем и потребителем в нашей текущей реализации. Существует множество реализаций очередей, но я не слишком ясно понял, как лучше всего управлять памятью узлов.
Например, производитель выглядит так:
queue.Add( new WorkUnit(...) );
А потребитель выглядит так:
WorkUnit* unit = queue.RemoveFront();
unit->Execute();
delete unit;
В настоящее время мы используем пул памяти для распределения. Вы заметите, что производитель выделяет память, а потребитель ее удаляет. Поскольку мы используем пулы, нам нужно добавить еще одну блокировку в пул памяти, чтобы должным образом защитить его. Похоже, что это в первую очередь сводит на нет преимущество в производительности очереди без блокировок.
На данный момент я думаю, что у нас есть следующие варианты:
- Реализуйте свободный от блокировок пул памяти.
- Выгрузите пул памяти и положитесь на поточно-безопасный распределитель.
Есть ли другие варианты, которые мы можем изучить? Мы пытаемся избежать реализации пула памяти без блокировок, но мы можем пойти по этому пути.
Спасибо.