Помещение Вектора C++ как участник в Классе, который Использование Пул памяти

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

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

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

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

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

5
задан Deep-B 3 April 2010 в 08:20
поделиться

2 ответа

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

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

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

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

3
ответ дан 15 December 2019 в 06:21
поделиться

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

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

__declspec( thread ) int tls_i = 1;

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

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

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

Извините, я не по теме.

0
ответ дан 15 December 2019 в 06:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: