Управление памятью в очереди со свободными блокировками

Мы искали возможность использовать в нашем коде очередь без блокировок, чтобы уменьшить конфликт блокировок между одним производителем и потребителем в нашей текущей реализации. Существует множество реализаций очередей, но я не слишком ясно понял, как лучше всего управлять памятью узлов.

Например, производитель выглядит так:

queue.Add( new WorkUnit(...) );

А потребитель выглядит так:

WorkUnit* unit = queue.RemoveFront();
unit->Execute();
delete unit;

В настоящее время мы используем пул памяти для распределения. Вы заметите, что производитель выделяет память, а потребитель ее удаляет. Поскольку мы используем пулы, нам нужно добавить еще одну блокировку к пулу памяти, чтобы должным образом защитить его. Похоже, что это в первую очередь сводит на нет преимущество в производительности очереди без блокировок.

На данный момент я думаю, что у нас есть следующие варианты:

  • Реализовать пул памяти без блокировки.
  • Дампить пул памяти и полагаться на него. на потокобезопасном распределителе.

Есть ли другие варианты, которые мы можем изучить? Мы пытаемся избежать реализации пула памяти без блокировок, но мы можем пойти по этому пути.

Спасибо.

6
задан lhumongous 23 June 2011 в 22:14
поделиться