Подтвердить что ты не робот

В многопоточном C/С++ malloc/new блокирует кучу при распределении памяти

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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