В многопоточном C/С++ malloc/new блокирует кучу при распределении памяти
Мне любопытно, есть ли блокировка для выделения памяти, если два потока одновременно запрашивают выделение памяти. Я использую OpenMP для многопоточности, кода на С++.
ОС: в основном Linux, но хотелось бы знать и для Windows и Mac.
Ответ 1
В некоторых реализациях могут быть улучшения, такие как создание кэша, зависящего от потока (в этом случае выделение небольших блоков будет заблокировано). Например, this от Google. Но в целом, да, есть блокировка на выделения памяти.
Ответ 2
По умолчанию Windows блокирует кучу, когда вы используете функции кучи Win API.
Вы можете контролировать блокировку, по крайней мере, во время создания кучи. Различные компиляторы и C runtimes делают разные вещи с семейством malloc/free. Например, API SmartHeap в один момент создал одну кучу на поток и поэтому не нуждался в блокировке. Также были варианты конфигурации для включения и отключения этого поведения.
В один момент в начале/середине 90-х годов компиляторы Borland Windows и OS/2 явно отключили блокировку кучи (преждевременную ошибку оптимизации) до тех пор, пока несколько потоков не были запущены с beginthread. Многие люди пытались порождать потоки с вызовом API OS, а затем были удивлены, когда куча повредила все в ад...
Современные реализации malloc стараются как можно блокировать, сохраняя отдельные "арены" для каждого потока.
Ответ 4
Свободный магазин является общим ресурсом и должен быть синхронизирован. Распределение/освобождение является дорогостоящим. Если вы многопоточность для производительности, то частое распределение/освобождение может стать узким местом. Как правило, избегайте выделения/освобождения внутри жестких циклов. Другой проблемой является ложное совместное использование.