Используйте mmap для выделения памяти - PullRequest
5 голосов
/ 20 января 2011

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

Ответы [ 2 ]

5 голосов
/ 20 января 2011

Да, mmap () должен быть реентерабельным, чтобы вы могли его использовать. Обратите внимание, что mmap () часто является довольно медленной операцией, поэтому вам, вероятно, лучше использовать ее только в тех (надеюсь) немногих и далеко от случая, когда это действительно необходимо, а не в качестве замены malloc () общего назначения.

POSIX 2008 содержит список функций, безопасных для асинхронных сигналов, которые можно безопасно вызывать из функции обработчика сигналов (см. Таблицу в разделе 2.4.2 в ссылке). mmap () отсутствует в этом списке, то есть вызов mmap () из функции обработки сигналов может привести к неопределенному поведению.

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

1 голос
/ 20 января 2011

РЕДАКТИРОВАТЬ: заменил входящий поток на потокобезопасный

malloc является поточно-ориентированным на большинстве ОС.

Какой из них вы используете и уверены, что он не является поточно-ориентированным? Или вам нужно, чтобы это было повторно (наверное, нет)?

...