Я предполагаю, что предлагаемый вариант использования заключается в том, что вы хотите кэшировать перекрывающуюся структуру «для каждой операции», чтобы избежать повторного выделения и освобождения динамической памяти, что может привести как к конфликту на распределителе, так и к фрагментации кучи.
Использование одного «пула» уменьшает конкуренцию между «конфликтом между всеми потоками, использующими распределитель, который используется для выделения и уничтожения перекрывающихся структур», до «конфликта между всеми потоками, выдающими или обрабатывающими операции ввода-вывода», что обычно хорошо. сделать. Вы правы, что вам нужно синхронизировать доступ, критический раздел или, возможно, блокировку SRW в эксклюзивном режиме, вероятно, лучше всего (последний немного быстрее для неоспариваемого доступа).
Уменьшения фрагментации кучи также стоит добиться в долго работающей системе.
Использование «стандартного» неинвазивного списка, такого как std::deque
, поначалу выглядит очевидным выбором, но проблема с неинвазивными коллекциями заключается в том, что они имеют тенденцию выделять и освобождать память для каждой операции (так что вы вернулись к исходному соглашению) . Гораздо лучше, ИМХО, поместить указатель в каждую перекрывающуюся структуру и просто связать их вместе. Это не требует выделения или освобождения дополнительной памяти при доступе к пулу и означает, что ваше соперничество возвращается только к потокам, которые используют пул.
Лично я считаю, что мне нужен только односвязный список структур для каждой операции для пула (свободный список), который на самом деле является просто стеком, и двусвязный список, если я хочу поддерживать список «используемых» «по- данные операции, которые иногда бывают полезны (хотя это не то, чем я сейчас занимаюсь).
Следующим шагом может быть несколько пулов, но это будет зависеть от конструкции вашей системы и от того, как работает ваш ввод-вывод.
Если у вас может быть несколько ожидающих операций отправки и получения для данного соединения, может быть полезно иметь небольшой пул на уровне соединения. Это может значительно снизить конкуренцию за ваш единственный общий пул, так как каждое подключение будет сначала пытаться использовать пул для каждого подключения, а если он пуст (или полон), вернуться к использованию глобального пула. Это, как правило, приводит к гораздо меньшему количеству конфликтов за блокировку глобального пула.
person
Len Holgate
schedule
31.12.2013