Размещение вектора C ++ в качестве члена в классе, использующем пул памяти - PullRequest
5 голосов
/ 03 апреля 2010

Я писал многопоточную DLL для доступа к базе данных с использованием ADO / ODBC для использования с унаследованным приложением. Мне нужно сохранить несколько соединений с базой данных для каждого потока, поэтому я поместил объекты ADO для каждого соединения в объект и подумал о том, чтобы сохранить их массив внутри пользовательского объекта threadInfo. Очевидно, что вектор будет работать лучше здесь - мне нужно удалять / переставлять объекты на ходу, а вектор упростит это. Проблема в том, что я выделяю кучу для каждого потока, чтобы избежать конфликтов и прочего, и выделяю всю свою память оттуда.

Итак, мой вопрос: как сделать так, чтобы вектор выделялся из динамической кучи? (Или он знает, как внутренне распределять память из той же кучи, что и его класс-обертка - звучит маловероятно, но я не парень C ++) Я немного погуглил и похоже, что мне может понадобиться написать распределитель или что-то - которая выглядит как большая часть работы, которую я не хочу. Есть ли другой путь? Я слышал, что вектор использует размещение нового для всего, что находится внутри, так может ли оператор перегрузки new работать с ним?

Мое скудное знание внутренностей C ++ не помогает, поскольку я в основном программист на C (даже в этом - относительно). Вполне возможно, я где-то упускаю что-то элементарное. Если не получится ничего проще - я мог бы просто пойти и заняться массивом, но, надеюсь, до этого не дойдет.

Я использую MS-VC ++ 6.0 (эй, грубо смеяться! :-P).

Любая / вся помощь будет высоко ценится.

Ответы [ 2 ]

3 голосов
/ 03 апреля 2010

как сделать так, чтобы вектор выделялся из динамической кучи?

Вы передаете его (во время компиляции) соответствующему распределителю. Здесь - классика того, как это сделать. Если вы последуете советам этой статьи (или даже просто скопируете код и адаптируете его там, где это необходимо), для программиста на C написание распределителя может оказаться проще, чем получить правильную семантику копирования класса с динамически размещенным массивом.

Обратите внимание, что если вы помещаете объекты в вектор (или в свой собственный массив FTM), которые сами используют кучу (например, строки), вы должны принять, что они также используют вашу специальную кучу. Для контейнеров стандартной библиотеки (std::basic_string<> такой контейнер) это легко, поскольку вы также можете передать им свой распределитель. Для ваших собственных типов вы должны убедиться в этом сами.

И постарайтесь уйти от VC6 как можно быстрее. Это ядовито

0 голосов
/ 03 апреля 2010

Посмотрите вверх __declspec

Следующий код объявляет локальную переменную целочисленного потока и инициализирует ее значением:

__declspec( thread ) int tls_i = 1;

На другой ноте. Не стоит держать соединения ADO долгое время открытыми. Вы получите много проблем с подключением БД. Они появятся открытыми для приложения. Однако при отправке запроса они будут получать сообщение «Общая ошибка сети».

Лучше как можно скорее закрыть соединение через ваше приложение и полагаться на пул соединений, управляемый ОС.

Кроме того, в зависимости от количества клиентов, подключающихся к БД, вы можете указать максимальное количество открытых сокетов на стороне сервера. Это из памяти. Как только соединение закрывается на стороне клиента, соединение на сервере переходит в состояние TIME_WAIT. По умолчанию сокет сервера закрывается примерно за 4 минуты, поэтому он не будет доступен другим клиентам в течение этого времени. Суть в том, что на сервере имеется ограниченное количество доступных сокетов. Сохранение слишком большого количества открытых соединений может создать проблему.

Извините, у вас там не по теме.

...