Динамическое выделение памяти использует кучу приложения/модуля/процесса (но не поток). Куча может обрабатывать только один запрос на выделение за раз. Если вы попытаетесь выделить память в «параллельных» потоках, они будут обрабатываться кучей в должном порядке. Вы не получите такого поведения, как: один поток ждет, чтобы получить свою память, в то время как другой может запросить часть, а третий получает часть. Потоки должны будут выстроиться в очередь, чтобы получить свой кусок памяти.
Что вам нужно, так это пул куч. Используйте ту кучу, которая не занята в данный момент, для выделения памяти. Но затем вы должны следить за тем, чтобы эта переменная не была освобождена в другой куче (это может привести к сбою).
Я знаю, что Win32 API имеет такие функции, как GetProcessHeap(), CreateHeap(), HeapAlloc() и HeapFree(), которые позволяют создавать новую кучу и выделять/освобождать память из определенной HANDLE кучи. Я не знаю эквивалента в других операционных системах (я искал их, но безрезультатно).
Вы, конечно, должны стараться избегать частых динамических распределений. Но если вы не можете, вы можете подумать (для переносимости) о создании собственного класса "кучи" (это не обязательно должна быть куча как таковая, просто очень эффективный распределитель), который может управлять большим куском памяти и, конечно же, класс интеллектуального указателя, который будет содержать ссылку на кучу, из которой он был получен. Это позволит вам использовать несколько куч (убедитесь, что они потокобезопасны).
person
Mikael Persson
schedule
01.02.2011