У меня многопоточное приложение, использующее boost::thread
, Из соображений производительности я бы хотел, чтобы каждый поток имел независимую кучу.
Я могу создать кучу, используя HeapCreate()
но неясно, как подключить это к библиотеке CRT, чтобы new
а также malloc
выделить память на созданную кучу. Как это может быть сделано?
Как это может быть сделано?
Это не может быть сделано без полной замены всего распределителя памяти. Например менеджер масштабируемой памяти копить делает именно это. Но замена распределителя памяти не для слабонервных.
Если вы хотите использовать кучу для каждого потока с HeapCreate
и ваш код размещения / освобождения разумно содержится, тогда вы можете просто позвонить HeapAlloc
а также HeapFree
явно в вашем потоке кода. Однако я был бы удивлен, если бы это было так же быстро, как стандартный распределитель CRT, который работает хорошо.
К сожалению, не существует безопасного и документированного способа замены кучи CRT. Только хаки.
За new
/delete
заявления вы могли бы предоставить глобальный operator new()
а также operator delete()
это выделит / освободит память в требуемой куче в соответствии с текущим потоком. Локальное хранилище потока (TLS) обычно используется для хранения дескриптора локальной кучи потока.
За malloc
/free
не существует такого документированного способа замены. Большинство хаков описаны Вот.
Вы можете предоставить «новый глобальный оператор», который вы можете использовать для проверки того, в каком потоке вы находитесь, и возврата памяти из соответствующей кучи. Разумеется, вам также потребуется указать собственное «глобальное удаление».
Это, конечно, будет только «ловить» случаи, когда фактически используются new и delete 🙂
Другой подход: использовать несколько библиотек DLL, каждая из которых идентична всем, кроме имени. Загрузите другую DLL для каждого потока.