2013-03-19 2 views
2

У меня есть сомнения.TBB tbb :: memory_pool <tbb :: scalable_allocator <char>> Как использовать его правильно?

Для tbb :: memory_pool < tbb :: scalable_allocator> shared_memory_pool_;

если это экземпляр в основной теме. И чем, я вызвал shared_memory_pool_.malloc (sizeof (my_class)) в рабочем потоке. Будет ли tbb выделять этот размер памяти из основной кучи, или он будет выделять его из потока «домен», чтобы избежать конфликтов блокировок с помощью обычного malloc(), чего бы избежать?

+0

Есть ли какая-то конкретная куча? Темы, как правило, имеют собственное пространство стека, но разделяют кучу с процессом, который их создал. – Praetorian

+0

Я тоже не понимаю, поскольку документ четко не обозначен, но из того, что я знаю, scalable_allocator не выделяет память непосредственно из динамической кучи, поэтому он не блокируется системным вызовом melloc() –

+0

Я не должен скажем, динамическая куча, нет такой вещи. я имел в виду «кучу доли», которую использует системный вызов malloc(). –

ответ

2

tbb::memory_pool был основан на тех же местах, что и у tbb::scalable_allocator. Итак, как только пул памяти захватывает память изначально (в вашем случае, как вы указали, от tbb::scalable_allocator), он будет использовать те же механизмы для распространения и повторного использования в потоках. То есть он масштабируется и позволяет избежать глобального блокирования как можно больше. Хотя, поскольку память по-прежнему является общим ресурсом, в любом случае некоторая синхронизация потоков неизбежна. В частности, я ожидал бы большего разногласия в отношении начальных запросов на память, поскольку кэши для каждой нити не нагреты; а также scalable_allocator пытается сохранить баланс между масштабируемостью и потреблением памяти, поэтому он не сходит с ума, когда кэширование на потоках перераспределяет память между потоками, что также является видом синхронизации потоков (хотя и более масштабируемым, чем блокировка).

Что касается [очень] начального распределения памяти с помощью масштабируемого_allocator, он проходит через mmap или VirtualAlloc для достаточно больших объемов памяти, а не через malloc.

0

Here - это некоторые полезные описания о том, как правильно реализовать пул памяти. Обратите внимание, что в соответствии с этим:

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

Надеюсь, это поможет.

Смежные вопросы