Соотношение потока на распределение динамического памяти

StackOverflow https://stackoverflow.com/questions/3902167

  •  29-09-2019
  •  | 
  •  

Вопрос

Я только что узнал, что в C языке C malloc Функция поставляется с проблемой контента резьбы при использовании в многопоточных приложениях.

В C ++ делает operator new страдать от той же проблемы? Если да, какой Tecnhique я могу использовать, чтобы избежать этого, это звучит как большой штраф в производительности приложения?

Это было полезно?

Решение

То, что «проблема» резкости на самом деле зависит от реализации. Некоторые из реализации Malloc в общем использовании изначально не были разработаны с учетом многопотативных. Но реализация Malloc, предназначенная для многопотативных приложений, не должна страдать от конкуренции в нормальных обстоятельствах.

В качестве примера реализации Malloc, разработанная с учетом многопотативных, посмотрите на jemalloc..

Другие советы

В зависимости от реализации новых, но, как правило, на основе Malloc на основе да. Вот несколько вещь, которую вы можете сделать:

  • Используйте профилировщик, чтобы подсчитать количество вызовов в malloc() (и возможно brk()) в секунду убедитесь, что у вас есть проблема со спором с malloc().
  • Попробуйте работать с параллельным распределением памяти (т. Е. замазывать)
  • Используйте стек всякий раз, когда это возможно: не звоните новому, когда вам не нужно. Также помните, что небольшие копии, как правило, больше кэшируют, чем указатели и данные общие среди потоков.

В C ++ оператор новый страдает от такой же проблемы?

Да, в большинстве реализаций он делает.

Если вы уже находитесь в C ++, Резьбовые строительные блоки это библиотека шаблона C ++, которая должна соответствовать вашим потребностям. Он имеет масштабируемые распределения, структуры данных, а интернет сайт и более...

Проблема с пребыванием потока в Malloc просто исчезает, что куча должна быть защищена мутекс с аналогичным устройством всякий раз, когда она обновляется. Если два потока обновляют кучу одновременно, у вас будет состояние гонки. Та же самая проблема относится к новой, поэтому нет никакой фундаментальной причины, по которой следует иметь меньше споров, чем следующая.

Сказав это, есть несколько хитростей, чтобы минимизировать споры. Первый - разбить кучу на отдельные арены. Каждая арена имеет свой собственный замок. Если нить пытается выделить память, а одна арена заблокирована, она просто пытается выделить следующую арену.

Free нужно будет получить доступ к той же арене, которая использовалась для Malloc. Это также может быть оптимизировано путем размещения указателя на бесплатный список. Это можно сделать атомным образом. Когда следующая арена становится разблокированной, все указатели в свободном списке будут освобождены должным образом.

Эти методы помогают предотвратить, но не устранить разум, что означает в модели потребительской резьбы производителей, вам может быть лучше, имея потребительские указатели перевала к производителю, где их можно использовать или удалять.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top