В многопоточном C / C ++ блокирует ли malloc / new кучу при выделении памяти - PullRequest
24 голосов
/ 24 декабря 2010

Мне интересно, есть ли блокировка выделения памяти, если два потока одновременно запрашивают выделение памяти.Я использую OpenMP для многопоточности, код C ++.

ОС: в основном linux, но хотелось бы знать и о Windows и Mac.

Ответы [ 4 ]

14 голосов
/ 24 декабря 2010

В некоторых реализациях могут быть улучшения, такие как создание кеша, специфичного для потока (в этом случае выделение небольших блоков будет без блокировки).Например, это от Google.Но в целом да, есть блокировка выделения памяти.

7 голосов
/ 24 декабря 2010

По умолчанию Windows блокирует кучу при использовании функций кучи Win API.

Вы можете управлять блокировкой, по крайней мере, во время создания кучи.Различные компиляторы и среды выполнения C делают разные вещи с семьей malloc / free.Например, API SmartHeap в один момент создавал одну кучу на поток и поэтому не нуждался в блокировке.Существовали также опции конфигурации для включения и выключения этого поведения.

В какой-то момент в начале / середине 90-х годов компиляторы Borland для Windows и OS / 2 явно отключали блокировку кучи (ошибка преждевременной оптимизации) до несколькихтемы были начаты с beginthread.Многие пытались порождать потоки с помощью вызова OS API, а затем были удивлены, когда куча повредила себя до чертиков ...

6 голосов
/ 24 декабря 2010

http://en.wikipedia.org/wiki/Malloc

Современные реализации malloc стараются быть максимально свободными от блокировки, сохраняя отдельные «арены» для каждого потока.

5 голосов
/ 24 декабря 2010

Бесплатный магазин является общим ресурсом и должен быть синхронизирован.Распределение / освобождение является дорогостоящим.Если вы используете многопоточность для повышения производительности, то частое распределение / освобождение может стать узким местом.Как правило, избегайте выделения / освобождения внутри замкнутых циклов.Другая проблема - ложный обмен.

...