5

レガシーアプリケーションで使用するために、ADO/ODBCを使用してデータベースにアクセスするためのマルチスレッドDLLを作成してきました。スレッドごとに複数のデータベース接続を維持する必要があるため、接続ごとにADOオブジェクトをオブジェクトに配置し、それらの配列をカスタムthreadInfoオブジェクト内に保持することを検討しました。明らかに、ここではベクトルの方が適しています。外出先でオブジェクトを削除/再配置する必要があります。ベクトルを使用すると、それが単純化されます。問題は、ヒープの競合などを回避するためにスレッドごとにヒープを割り当て、そこからすべてのメモリを割り当てることです。

だから私の質問は:どうすればベクトルをスレッド固有のヒープから割り当てることができますか?(または、ラッパークラスと同じヒープからメモリを割り当てることを内部的に知っているでしょうか?可能性は低いですが、私はC ++の人ではありません)少しグーグルで調べたところ、アロケータなどを作成する必要があるようです-これは私が望まない仕事のように見えます。他に方法はありますか?ベクトルは配置を使用していると聞きました-内部のすべてのものに新しいので、オーバーロード演算子newをそれに組み込むことができますか?

私は主にCプログラマーであるため(それでも-比較的)、C++の内部に関する私の知識は役に立ちません。どこかで初歩的なものが欠けている可能性が非常に高いです。簡単なことは何も思い浮かびません-私はただ配列のことをするかもしれませんが、うまくいけばそれは実現しません。

私はMS-VC++6.0を使用しています(笑うのは失礼です!:-P)。

どんな/すべての助けも大歓迎です。

4

2 に答える 2

3

スレッド固有のヒープからベクトルを割り当てるにはどうすればよいですか?

(コンパイル時に) 適切なアロケータを渡します。これは、これを行う方法の古典です。その記事のアドバイスに従えば (または単にコードをコピーして、必要に応じて適応させるだけでも)、C プログラマーにとってアロケーターを作成することは、動的に割り当てられた配列を持つクラスのコピー セマンティクスを正しく理解するよりも簡単かもしれません。

オブジェクトをベクター (または独自の配列、FTM) に配置する場合、それ自体がヒープ (文字列など) を使用する場合、それらも特別なヒープを使用することを考慮する必要があることに注意してください。標準ライブラリのコンテナ (std::basic_string<>はそのようなコンテナ) の場合は、アロケータも渡すことができるので簡単です。自分のタイプについては、自分で確認する必要があります。

そしてできるだけ早く VC6 から離れてください。有毒です。

于 2010-04-03T08:38:11.137 に答える
0

__declspec を調べる

次のコードは、整数のスレッド ローカル変数を宣言し、値で初期化します。

__declspec( thread ) int tls_i = 1;

別の注意事項。ADO 接続を長時間開いたままにしておくことはお勧めできません。データベース接続で多くの問題が発生します。それらはアプリケーションに対して開かれているように見えます。ただし、クエリを送信すると、「一般的なネットワーク エラー」メッセージが表示されます。

アプリを介してできるだけ早く接続を閉じ、OS によって管理される接続プールに依存することをお勧めします。

また、データベースに接続しているクライアントの数によっては、サーバー側で開いているソケットの最大数に達する可能性があります。これは記憶からです。クライアント側で接続が閉じられると、サーバー上の接続は TIME_WAIT 状態になります。デフォルトでは、サーバー ソケットが閉じるのに約 4 分かかるため、その間、他のクライアントは使用できません。肝心なのは、サーバーで使用できるソケットの数が限られているということです。あまりにも多くの接続を開いたままにしておくと、問題が発生する可能性があります。

すみません、話が逸れてしまいました。

于 2010-04-03T09:27:42.917 に答える