Мне любопытно, есть ли блокировка выделения памяти, если два потока одновременно запрашивают выделение памяти. Я использую OpenMP для многопоточности, код C++.
ОС: в основном Linux, но хотелось бы знать и для Windows и Mac.
Мне любопытно, есть ли блокировка выделения памяти, если два потока одновременно запрашивают выделение памяти. Я использую OpenMP для многопоточности, код C++.
ОС: в основном Linux, но хотелось бы знать и для Windows и Mac.
В некоторых реализациях могут быть улучшения, такие как создание кэша для конкретного потока (в этом случае выделение небольших блоков будет неблокируемым). Например, это от Google. А вообще да, блокировка по выделению памяти есть.
По умолчанию Windows блокирует кучу, когда вы используете функции кучи Win API.
Вы можете управлять блокировкой, по крайней мере, во время создания кучи. Различные компиляторы и среды выполнения C по-разному работают с семейством malloc/free. Например, SmartHeap API в какой-то момент создал одну кучу для каждого потока и поэтому не нуждался в блокировке. Были также параметры конфигурации для включения и выключения этого поведения.
В какой-то момент в начале/середине 90-х компиляторы Borland для Windows и OS/2 явно отключили блокировку кучи (ошибка преждевременной оптимизации) до запуска нескольких потоков с помощью beginthread. Многие люди пытались создавать потоки с помощью вызова OS API, а затем были удивлены, когда куча испортила себя к черту...
http://en.wikipedia.org/wiki/Malloc
Современные реализации malloc стараются быть как можно более свободными от блокировок, сохраняя отдельные «арены» для каждого потока.
Бесплатное хранилище является общим ресурсом и должно быть синхронизировано. Распределение/освобождение является дорогостоящим. Если вы используете многопоточность для повышения производительности, частое выделение/освобождение может стать узким местом. Как правило, избегайте выделения/освобождения внутри узких циклов. Еще одна проблема — ложный обмен.