2013-06-26 2 views
1

Когда память распределяется с использованием нового или malloc, распределителю, возможно, придется защищать себя от повторного входа. Я вижу два способа сделать это:Какова производительность распределителя C/C++ в многопоточном контексте?

  • Большие мьютексы. Это решение прост, но имеет низкую производительность.
  • Пул памяти зарезервирован для каждого потока. Производительность высокая, но размер пула может быть трудно оценить.

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

Вы знаете, какой распределитель использует какой метод? Есть ли в этом стандарте?

+0

Большинство компетентных распределителей сегодня используют комбинацию обоих. – Mysticial

ответ

0

Весь многопоточный программный анализ, который я сделал с помощью intel parallel studio (под окнами), всегда показывает событие блокировки и время ядра из-за выделения. Это означает, что новый C++-компилятор VS'08 в основном использует мьютекс, чтобы поддерживать целостность памяти.

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

+0

Что вы называете ИИА? – Jezz

+0

Извините, я сделал опечатку, я бы сказал, что RAII (Ressource Acquisition Is InItialization). но это ваше дело .., «это своего рода ...». когда вы инициируете объект, или поток выделяете и инициализируете всю память и var, которые вы используете после. или уменьшить минимальное использование динамической памяти. – alexbuisson

0

C++ 17 начинает указывать поведение распределителей в многопоточных приложениях:

  • std::pmr::unsynchronized_pool_resource не поточно-, и не может быть доступен из нескольких потоков одновременно
  • std::pmr::synchronized_pool_resource может быть доступен из нескольких потоков без внешняя синхронизация, и может иметь потоковые пулы для уменьшения затрат на синхронизацию. Если ресурс памяти доступен только из одного потока, функция unsynchronized_pool_resource более эффективна.
+0

В C, начиная с версии 2.16, 'glibc' предоставляют пул памяти для каждого потока: http://patchwork.sourceware.org/patch/19042/ – Jezz