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

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

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


person Janik Zikovsky    schedule 24.12.2010    source источник
comment
Вы боитесь, что двум потокам будет выделена одна и та же память? Если это так, вам не о чем беспокоиться. Если бы malloc не был потокобезопасным, вы не были бы первыми, кто это обнаружил. Если вы спрашиваете, как malloc обеспечивает безопасность потоков, это зависит от реализации.   -  person EnabrenTane    schedule 24.12.2010
comment
Мой вопрос был больше связан с производительностью при распределении параллельных потоков.   -  person Janik Zikovsky    schedule 26.12.2010


Ответы (4)


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

person Kirill V. Lyadvinsky    schedule 24.12.2010

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

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

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

person JimR    schedule 24.12.2010

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

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

person MK.    schedule 24.12.2010
comment
Википедия не является авторитетным источником: Обязательно используйте его как отправную точку для изучения и поиска авторитетных источников. Но его не следует цитировать, так как он не является авторитетным источником. - person Martin York; 24.12.2010
comment
Ссылка полезна, независимо от того, авторитетна она или нет. Мы не пишем здесь научные статьи. - person Brent Bradburn; 31.01.2011

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

person watson1180    schedule 24.12.2010